天天看點

第四周

20135103王海甯

《Linux核心分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000

程式員程式設計不可能很健壯,會出bug,假如寫的程式可以任意控制計算機的資源會很危險,是以産生了OS核心态和

使用者态兩個概念。我們這周的實驗就是關于作業系統的使用者态、核心态切換以及中斷。

先談幾點了解:

1)OS采用系統調用實作使用者态程序與I/O進行互動,使用者态下調用系統資源須采用系統調用。

2)從使用者态進入核心态有2種方式:系統調用(trap陷入)、中斷。

3)狀态切換時會儲存寄存器上下文,如使用者态堆棧頂位址、當時的狀态字、當時的cs:eip值。

4)system_ call是linux中所有系統調用的入口點,系統調用的參數由eax傳遞。

實驗過程:

下面分别用兩種不同的c代碼,實作0x20号系統調用getpid來擷取目前核心名稱。

1.直接調用庫函數API

第四周

2.使用内嵌彙編的c代碼

第四周

分析:

    API函數getpid()中将系統調用封裝好,執行int 0x80語句後即進入核心态中的System_call()。

System_call()中會執行中斷服務程式sys_getpid(),中斷服務完成後如沒有程序間排程,則執行iret傳回使用者

态繼續執行,如有程序間排程,則執行程序間排程。

總結:

    通過本周的學習,了解了系統調用與中斷的關系,即系統調用的三層皮:xyz( API )、system_call( 中斷

向量 )和sys_xyz( 服務程式 )。系統調用是一種特殊的中斷,用eax放調用号碼,ebx、ecx等放參數,eax放

傳回值,int 0x80進入中斷處理程式,此時進入核心态。