運行機制
什麼是機器指令?
能夠讓CPU直接識別,執行的指令就是機器指令。因爲CPU只認識0和1,所以機器指令是由)01組成的指令集。
程序代碼怎樣轉化成機器指令的?
程序代碼是通過編譯器,進過一下四個步驟形成最終二進制可執行文件:
- 預處理:程序經過CPP預處理器,刪除註釋,刪除define,展開宏定義,添加行號,文件名標識等一些列操作,形成一個.i文件。
- 編譯:把預處理完成的.i文件,進行詞法分析、語法分析、語義分析以及優化後產生彙編代碼文件.asm。
- 彙編: 編譯器把彙編代碼轉化爲CPU可以執行的二進制機器指令模塊.o文件。
- 鏈接:程序代碼的各個引用模塊是獨立地編譯的,將各模塊“組裝”起來,這個過程就是鏈接,鏈接形成最後的CPU可執行文件。(例如windows下的.exe文件)
所謂宏,就是一些命令組織在一起,作爲一個單獨命令完成一個特定任務。
機器指令的分類
操作系統將機器指令分爲,特權指令(不允許用戶程序使用指令),和非特權指令。
CPU作爲計算機的大腦,用執行機器指令的方式支配計算機內/外部設備。一些非常危險的指令是不允許用戶直接使用的,如內存清零指令。
爲了在不同的情況下運行分別運行兩種指令,操作系統又把CPU分爲兩種狀態:用戶態(此時cpu只能執行非特權指令)和核心態(特權和非特權指令都可以執行)。
操作系統內核
CPU用戶態下運行應用程序。
CPU內核態下運行內核程序。
應用程序完成一次完整的設備調用的步奏:
- 應用程序首先,利用操作系統提供的庫函數,進行系統調用(執行陷入指令),請求操作系統的內核服務,CPU從用戶態切換到內核態。
- 內核程序,調用用硬件驅動程序操作硬件設備,完成以後利用中斷處理程序,將CPU內核態再切回用戶態。
內核程序
內核是計算機上配置的底層軟件,是操作系統最基本,最核心的部分。實現操作系統內核功能的那些程序就是內核程序。
內核程序功能主要包括兩個方面
- 系統調度管理:時鐘管理,中斷處理,原語。
- 系統資源管理,進程管理,內存管理,存儲管理,設備管理。
原語:是一種特殊的程序,其執行具有原子性(設備驅動,CPU切換),要麼不執行,要麼一次性執行完畢中間不能中斷。類似宏的概念。
中斷和異常
CPU用戶態和核心態是怎樣切換實現的呢?答案是中斷。
由於操作系統管理工作,比如進程切換,分配I/O設備等,都需要特權指令,因此CPU需要從用戶態轉爲核心態,中斷可以使CPU從用戶態切換爲內核態,使操作系統獲得計算機的控制權。
中斷分類
中斷可以分爲內中斷和外中斷兩種類型。
- 內中斷:應用程序進行系統調用,硬件故障(比如內存缺頁),軟件故障(比如整數除0)等引起的中斷。
- 外中斷:比如I/O設備完成,發出的中斷信號,用戶強行kill一個進程。
按照中斷信號來源於區分
- CPU內部,與當前指令執行相關的就是內中斷,
- 來自於CPU外部,與當前指令執行無關的就是外中斷。
一個完整外中斷處理步驟:
- CPU在用戶態下,依次執行機器指令,每次執行完一個指令以後,CPU都要檢查是否有外部中斷信號。
- 如果檢測到外部中斷信號,在從用戶態切換到核心態之前,需要保護被中斷進程運行的上下文環境。
- 根據中斷信號,轉入相應操作系統中斷處理程序,處理中斷,CPU從用戶態切換到核心態執行系統調用。
- 完成處理以後,需要恢復中斷進程的CPU環境,運行現場。然後從核心態轉到用戶態,切回原來進程繼續往下執行。
系統調用
操作系統作爲用戶和計算機硬件之間的中間層,需要向上層的用戶和應用程序提供一些簡單易用的服務接口;主要包括命令接口和程序接口。
用戶可以直接通過終端(terminal)輸入命令(cd,cat,netstat,ps,df等 ),直接完成系統調用;還可以通過編寫應用程序調用操作系統提供的程序接口(open(…),write(…)),完成系統調用。
“系統調用” 是操作系統提供給應用程序使用的一組接口,是一種可供應用程序調用的特殊函數;應用程序可以發出系統調用請求來獲得操作系統的服務。計算機中的各種共享資源都由操作系統統一管理,用戶程序想要操作系統資源,例如文件管理,必須通過系統調用的方式向操作系統發出服務請求,由操作系統代爲完成。保證系統的穩定和安全性,防止用戶非法操作。
需要注意的是操作系統提供的系統調用,並不是我們通常編寫程序時所使用的庫函數。爲了降低編程的複雜度,現代高級語言一般會把相應的系統調用封裝成庫函數,方便程序員使用。
應用程序執行一個系統調用的完整步驟:
- 傳遞系統調用參數,例如write(參數)
- 執行陷入指令,中斷操作(CPU從用戶態向核心態切換)
- CPU進入核心態, 執行系統調用相應的服務程序
- 執行完畢,中斷,從核心態向用戶態切換,返回用戶程序