Linux核心分析4 扒開系統呼叫三層皮

2021-07-10 13:01:05 字數 2910 閱讀 4716

實驗:使用庫函式api和c**中嵌入彙編**兩種方式使用同乙個系統呼叫

席金玉+《linux核心分析》mooc課程 」

系統呼叫:系統呼叫只是乙個特殊的中斷。我們通過庫函式和系統呼叫打交道,庫函式把系統呼叫封裝起來。

1、儲備知識——核心態和使用者態

核心態:在高執行級別下,**可以執行特權指令,訪問任意的物理記憶體,這種cpu執行級別就對應著核心態。

使用者態:在使用者態級別下,**的掌控範圍會受到限制,只能在對應級別允許的範圍內活動。

注:intel x86cpu有四種不同的執行級別0-3,linux只使用了其中的0級和3級分別來表示核心態和使用者態。

2、為什麼有許可權級別的劃分?

若沒有使用者態和核心態的劃分,使用者寫的不健壯的程式就可以執行特權指令時,就很容易是系統崩潰。作業系統發展過程中劃分了使用者態和核心態,是系統更穩定的機制。

3、暫存器在系統呼叫中的作用

cs暫存器的最低兩位表明了當前**的特權級。cpu每條指令的讀取都是通過cs:eip這兩個暫存器:其中cs是**段選擇暫存器,eip是偏移量暫存器。

4、記憶體位址空間

一般在linux中,位址空間是乙個顯著的標誌:0xc0000000以上的位址空間只能在核心態下訪問,0x0000000--0xbfffffff的位址空間在兩種狀態下都可以訪問。

注:產生中斷是從使用者態進入核心態的主要方式。

5、暫存器上下文:

5.1從使用者態切換到核心態時:

必須儲存使用者態的暫存器上下文;

同時把核心態的暫存器的值放到暫存器中。

5.2中斷/int指令會在堆疊上儲存一些暫存器的值:

如使用者態棧頂位址;

當前的狀態字;

當時的cs:eip的值。

5.3中斷發生後的第一件事就是儲存現場:

儲存現場:就是進入中斷程式,儲存需要用到的暫存器的資料。

5.4中斷處理結束前最後一件事就是恢復現場:

恢復現場:就是退出中斷程式恢復儲存暫存器的資料。

注:iret指令和中斷訊號(包括int指令)發生時的cpu做的動作整好相反。

如下圖所示

中斷指令interrupt(ex:int 0x80)開始進行系統呼叫;

儲存當前cs:eip,ss:esp,eflags的值到核心堆疊,同時載入了中斷服務程式的位址到cs:eip以及核心堆疊棧頂指標到ss:esp中。int指令完成上述操作過程。

核心**,完成中斷服務:

1、作業系統為使用者態程序與硬體裝置進行互動提供了一組介面——系統呼叫。

2、作業系統提供的api和系統呼叫的關係。

api只是乙個函式定義;

系統呼叫通過軟中斷向核心發出乙個明確的請求。

3、不是每個api都對應乙個特定的系統呼叫:

4、返回值

注:系統呼叫的三層皮:api,中斷向量,中斷服務程式

5、系統呼叫的服務例程:

5.1 當使用者態程序呼叫乙個系統呼叫時,cpu切換核心態並開始執行乙個核心函式。

5.2 傳參:

5.3 系統呼叫也需要輸入輸出引數,例如:

system call是linux中所有系統呼叫的入口點,每個系統呼叫至少有乙個引數,即由eax

5.3 傳遞的系統呼叫號;

系統呼叫號將xyz和sys_xyz關聯起來;用eax暫存器來傳遞引數;

5.4 暫存器引數具有如下限制:

四、實驗過程

開啟實驗樓虛擬機器,進入實驗樓環境;

新建乙個名為 time.c的原始檔,並輸入**,如下圖:

編譯並執行該檔案,輸出如下結果:

該程式實現用庫函式方式觸發系統呼叫獲取系統當前時間,時間為:2023年3月16日14:27:5

3. 新建乙個名為 time-asm.c的原始檔,並輸入**,如下圖

編譯並執行該檔案,輸出結果如下:

該程式是用彙編方式觸發系統呼叫獲取系統當前時間,時間為:2023年3月16日14:28:30

4. 完成了對time.c和time-asm.c的編譯和執行,下面將這兩個程式儲存到實驗樓**庫中:

如圖所示,已經成功將time.c和time-asm.c檔案儲存到實驗課**庫中。

Linux核心分析實驗4 系統呼叫

cpu工作狀態分為核心態與使用者態,他們的執行的指令的許可權不同,使用者態程式不能訪問0xb00000以後的的記憶體 虛擬記憶體 系統核心會提供一些系統呼叫,它們執行一些底層的,有關硬體的功能,出於安全與相容的考慮,使用者態程式無法訪問硬體,需要通過系統呼叫來實現一些功能,如獲取當前事件,在螢幕上顯...

linux系統之核心調優

1 編輯核心配置檔案 永久性 vim etc sysctl.con2 引數及簡單說明 net.ipv4.tcp fin timeout 2 保持在fin wait 2狀態的時間,使系統可以處理更多的連線。此引數值為整數,單位為秒。net.ipv4.tcp tw reuse 1 開啟重用,允許將tim...

linux 核心調優

設定linux核心引數 配置 linux 核心引數 2種方法 修改後不用重啟動更新 sbin sysctl p 第一種 開啟 etc sysctl.conf 複製如下內容 kernel.shmall 2097152 kernel.shmmax 2147483648 kernel.shmmni 409...