潘恆 + 原創做品轉載請註明出處 + 《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000 編程
1、使用庫函數API和C代碼中嵌入彙編代碼兩種方式使用同一個系統調用安全
1.使用庫函數API:函數
我選用第2號系統調用,forkspa
實驗截圖以下:先是編寫調用函數的c代碼指針
開始運行:code
2.嵌入彙編代碼:blog
彙編代碼分析: 接口
"mov $0x2,%%eax\n\t" /*將系統調用號2放入eax中*/ "int $0x80\n\t" /*中斷向量號0x80,即128*/ "mov %%eax,%o\n\t" /*將保存在eax中的返回值賦給pid*/ :"=m"(pid)
運行:進程
2、總結事件
系統調用的工做機制:
通常狀況下,應用程序經過應用編程接口(API)而不是直接經過系統調用來編程。這點很重要,由於應用程序使用的這種編程接口實際上並不須要和內核提供的系統調用一一對應。一個API定義了一組應用程序使用的編程接口。它們能夠實現成一個系統調用,也能夠經過調用多個系統調用來實現,而徹底不使用任何系統調用也不存在問題。
用戶空間的程序沒法直接執行內核代碼。它們不能直接調用內核空間中的函數,由於內核駐留在受保護的地址空間上。若是進程能夠直接在內核的地址空間上讀寫的話,系統安全就會失去控制。因此,應用程序應該以某種方式通知系統,告訴內核本身須要執行一個系統調用,但願系統切換到內核態,這樣內核就能夠表明應用程序來執行該系統調用了。
通知內核的機制是靠軟件中斷實現的。首先,用戶程序爲系統調用設置參數。其中一個參數是系統調用編號。參數設置完成後,程序執行「系統調用」指令。x86系統上的軟中斷由int產生。這個指令會致使一個異常:產生一個事件,這個事件會導致處理器切換到內核態並跳轉到一個新的地址,並開始執行那裏的異常處理程序。
在Linux中,每一個系統調用被賦予一個系統調用號。這樣,經過這個獨一無二的號就能夠關聯繫統調用。當用戶空間的進程執行一個系統調用的時候,這個系統調用號就被用來指明究竟是要執行哪一個系統調用。進程不會說起系統調用的名稱。
除了系統調用號之外,大部分系統調用都還須要一些外部的參數輸人。因此,在發生異常的時候,應該把這些參數從用戶空間傳給內核。最簡單的辦法就是像傳遞系統調用號同樣把這些參數也存放在寄存器裏。在x86系統上,ebx, ecx, edx, esi和edi按照順序存放前五個參數。須要六個或六個以上參數的狀況很少見,此時,應該用一個單獨的寄存器存放指向全部這些參數在用戶空間地址的指針。