實驗:使用庫函式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中所有系統呼叫的入口點,每個系統呼叫至少有乙個引數,即由eax5.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...