Linux核心分析。4

2puT發表於2016-07-30


扒開系統呼叫的三層皮

使用者態,核心態和中斷

1,核心態:在高執行級別下,程式碼可以執行特權指令,訪問任意的實體地址。
2,使用者態
-Intel x86 CPU有四種不同的執行級別0~3,Linux只用其中的0和3來表示核心態和使用者態
-區分核心態和使用者態:CPU每條指令的讀取都是通過cs:eip,cs暫存器最低兩位表明了當前程式碼的特權級。
-核心態下可訪問所有地址空間
-0xc0000000(邏輯地址)以上的空間只能在核心態下訪問
-0x00000000 ~ 0xbfffffff 核心態和使用者態均可訪問
使用者態轉換為核心態的主要方式:中斷
3,使用者態到核心態的切換:必須儲存使用者態的暫存器上下文,包括使用者態棧頂地址、當時的狀態字、cs:eip的值,以及核心態的棧頂地址、當時的狀態字、中斷處理程式入口。
-中斷髮生後的第一件事:儲存現場(SAVE_ALL:儲存需要用到的暫存器資料)。
-中斷處理結束前的最後一件事:恢復現場(RESTORE_ALL:退出中斷程式,恢復儲存暫存器的資料)。

系統呼叫概述

意義:作業系統為使用者態程式與硬體裝置進行互動提供了一組介面。
API:應用程式程式設計介面,是一個函式定義。
系統呼叫:通過軟中斷向核心發出一個明確的請求。
API與系統呼叫不是一一對應的
系統呼叫“三層皮:(1)API(2)中斷向量(3)中斷服務程式。

系統呼叫的引數傳遞:
-函式呼叫——壓棧
-使用者態到核心態——暫存器傳遞。
每個引數長度不能超過32位,個數不能超過6個。
超過的話?
使某個暫存器中儲存指標,指向記憶體,記憶體中儲存引數。

使用庫函式API和C程式碼中嵌入彙編程式碼觸發同一系統呼叫

使用庫函式API獲取系統當前的時間

結果:

使用C程式碼中嵌入彙編程式碼觸發系統呼叫獲取系統當前時間

執行結果:

實踐

24號getuid



總結

通過本週學習,我們簡單瞭解了系統呼叫,並將其“扒皮”老師視訊中所講解的三層皮:API,中斷向量以及中斷服務程式,分別所對應視訊中的XYZ,system_call和sys_xyz.系統呼叫返回的值長度不能超過32位而且個數不能超過6個。在實驗中關於彙編程式碼的理解還不是很透徹,在以後學習中還需多學習。

轉自朱國慶+原創作品轉載請註明出處 + 《Linux核心分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000

相關文章