此筆記來源於趙炯先生編著的《Linux內核注釋》一書
*注:
早期的內核0.11版本,包括以下幾個文件:
bootimage.Z -具有美國鍵盤代碼的壓縮啟動映像文件
rootimage.Z -以1200kb壓縮的根文件系統映像文件
linux-0.11.tar.Z -內核源代碼文件
as86.tar.Z -linux bruce evans 二進制執行文件,是16位的匯編程序和裝入程序
ISTALL-0.11 -更新過的安裝信息文件*
單內核模式的內核粗略的分為三層:
1)調用服務的主程序層
2)執行系統調用的服務層
3)支持系統調用的底層函數
在單內核模式中操作系統提供服務的流程為:應用主程序調用指定參數,使cpu從用戶態(user mode)切換到核心態(kernal mode);然後系統根據參數調用不同的服務程序;服務程序再調用底層函數完成特定功能;服務結束後,cpu從核心態轉化為用戶態。
Linux內核主要由五個模塊組成:
進程調度
進程間通信
內存管理
文件系統
網絡接口
值得注意的是所有模塊都與進程調度模塊有關,因為它們都需要依靠進程調度程序來掛起或是重啟它們的進程。各個模塊之間的依賴關系是未來對於內核代碼閱讀的重要理論依據。
Linux系統將int32~int47(0x20~0x2f)對應於8259A發出的中斷請求信號IRQ0~IRQ15
Linux系統將程序編程發出的系統調用(system_call)中斷設置為int128(0x80)。
每經過一個系統滴答就會調用一次時鐘中斷處理函數(time_interrupt),該函數主要用來累計自系統啟動以來的滴答數,每發生一次時鐘中斷,jiffies變量+1。然後從被中斷程序的段選擇符中選擇當前特權級CPL作為參數調用do_timer函數。do_timer函數會對當前進程運行時間作累計,並且確保運行在內核態的程序(CPL=0)不會被搶占,用戶態運行的程序可以被搶占。補充:
Linux系統的特權級有三種:CPL、DPL、RPL
總的來說,CPL代表當前代碼段的權限,如果它想要去訪問一個段或門,首先要看看對方的權限如何,也就是檢查對方的DPL,如果滿足當前的權限比要訪問的權限高,則有可能允許去訪問,有些情況我們還要檢查選擇子的權限,即RPL,因為我們通過選擇子偏移量的方式去訪問一個段,這算是一個訪問請求動作,因此稱為請求訪問權限RPL(Requst Privilege Level)。當請求權限也滿足條件,那麼訪問就被允許了。
CPL是當前執行的任務的特權等級。通常情況下,CPL等於代碼所在段的特權等級,當程序轉移到不同的代碼段時,處理器將改變CPL。
DPL(Descriptor Privilege Level)表示門或者段的特權級
RPL(Rquest Privilege Level)是通過選擇子的低兩位來表現出來的(這麼說來,CS和SS也是存放選擇子的,同時CPL存放在CS和SS的低兩位上,那麼對CS和SS來說,選擇子的RPL=當前段的CPL)。
處理器通過檢查RPL和CPL來確認一個訪問是否合法。即提出訪問的段除了有足夠的特權級CPL,如果RPL不夠也是不行的(有些情況會忽略RPL檢查)