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進入中斷處理程式,此時進入核心态。