計算機系統 01
概論
信息就是位+上下文
- 用ASCII標準表示文本字符: 用一個惟一的單字節大小整數值來表示每一個字符
- 源文件經過編譯器, 彙編器和鏈接器翻譯成二進制可執行文件
- 全部信息由一串位表示,區分數據對象惟一方法是讀到的上下文
總線
- 傳送定長字節塊: 字
- 通常分4字(32位)/8字(64位)
操做系統內核
- 硬件和軟件之間的媒介,提供三種抽象:
- 文件是對IO的抽象,就是字符序列
- 虛擬存儲器是對主存和磁盤的抽象
- 進程是對處理器, 主存和IO設備的抽象
虛擬機
進程
- 操做系統對一個正在運行系統的抽象
- 處理器經過上下文切換實現多進程併發執行
- 上下文: 操做系統保持跟蹤進程運行所需的全部狀態信息
線程
- 一個線程能夠由多個線程的執行單元組成
- 全部線程運行在進程的上下文中,共享代碼和全局數據
- 多線程比多進程更容易共享數據, 網絡服務器並行處理中更高效
虛擬存儲器
- 抽象概念, 爲每一個進程提供獨自使用主存的假象, 稱爲虛擬地址空間
- 從低地址到高區域爲: 程序代碼和數據, 堆, 共享庫, 棧, 內核虛擬存儲器
信息的表示和處理
信息存儲
- 8位一字節: 最小可尋址存儲器單位
- 存儲器可視爲很是大的字節數組, 每一個字節由惟一數字標示: 地址
- 全部可能的地址集合爲虛擬地址空間
字長(32/64)
- 決定虛擬地址空間最大大小
- 字長w位, 虛擬地址範圍0~(2^w)-1, 程序最多訪問2^w個字節
- 如字長32位, 限定虛擬地址空間4GB
連接
連接器
- 連接是將各類代碼和數據部分收集起來並組合成爲一個單一文件的過程
- 能夠執行於編譯時: 源代碼翻譯成機器代碼
- 能夠執行於加載時: 程序被加載器加載到存儲器並執行時
- 能夠執行於運行時: 由應用程序來執行
- 連接由連接器執行, 實現分離編譯
目標文件
- 字節塊集合, 包括三種形式:
* 可從新定位目標文件: 能夠在編譯時與其餘可從新定位目標文件合併,建立一個可執行目標文件
* 共享目標文件: 特殊可從新定位目標文件, 能夠在加載或運行時被動態地加載到存儲器並連接
* 可執行目標文件: 可被拷貝到存儲器並執行
- 編譯器和彙編器生成可從新定位目標文件或共享目標文件, 連接器生成可執行目標文件
- 目標模塊是一個字節序列, 目標文件就是存放在磁盤文件中的目標模塊
可從新定位目標文件
- 各個系統目標文件格式不一樣, unix爲例格式爲ELF
- ELF頭
* 以一個16字節的序列開始, 其描述了生成該文件系統字的大小和字節順序
* 剩下部分包括ELF頭的大小, 目標文件的類型, 機器類型, 字節部表的文件偏移, 字節頭部表中的條目大小和數量
符號和符號表
- 每一個可從新定位目標模塊m都有一個符號表, 它包含m所定義和引用的符號信息
- 在連接器的上下文中包含三種符號:
* m定義並能被其餘模塊引用的全局符號
* 其餘模塊定義並被模塊m引用的全局符號, 這些符號稱爲外部符號
* 只被模塊m定義和引用的本地符號
符號解析
- 連接器解析符號引用是將每一個引用與它輸入的可重定位目標文件的符號表中的一個肯定的符號定義聯繫起來
- 編輯器只容許每一個模塊中每一個本地符號中有一個定義
- 引用外部符號時會假設符號在其餘模塊中定義, 生成連接器符號表條目, 若是連接器在任何輸入模塊找不到則輸出錯誤信息並終止
解析多重定義全局符號
- 編譯時編譯器向彙編器輸出每一個全局符號分爲強或弱, 彙編器把這個信息隱含地編碼在可從新定位目標文件符號裏
- 函數和已經初始化的全局變量爲強符號, 未初始化的全局變量爲弱符號
- 連接器處理規則: * 不容許有多個強符號 * 若是有一個強符號和多個弱符號, 選擇強符號 * 多個弱符號則隨機選擇
歡迎關注本站公眾號,獲取更多信息