“casualet + 原創作品轉載請注明出處 + 《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000 ”,
Linux系統中提供了很多的系統調用, 這是用戶程序進入0特權級和硬件交互的接口. 我們用c語言進行編程的時候, 使用的很多庫函數就是對系統調用的一種封裝. 所有的系統調用都是通過int 0x80以一種軟中斷的方式來實現的, 為了區別不同的系統調用, 有一個系統調用的號, 可以通過這個網址進行查詢:http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl 這個系統調用號可以通過eax 寄存器進行傳遞. 也就是說, 我們先向寄存器eax中傳入系統調用號, 然后使用int 0x80指令, 就可以調用相應的系統調用(中斷處理函數). 系統調用執行完成以后, 會有一個函數的返回值, 這個返回值通過eax寄存器返回. 所以, 我們在系統調用執行完成以后, 通過eax 可以獲得該系統調用的返回值, 我們通過一個例子程序來展示這個過程:
#include<stdio.h> #include<time.h> #include<unistd.h> int main(){ pid_t my_id; asm volatile( "mov $20,%%eax\n\t"//20傳如eax,表示使用20號系統調用 "int $0x80\n\t" //產生中斷,系統調用入口 "mov %%eax,%0\n\t"//eax是返回至, 寫到內存變量my_id中. :"=m"(my_id) ); printf("asm_result=%d, api_result=%d\n",my_id, getpid()); return 0; }
我們把上面的程序保存為sys_asm.c 然后通過 gcc sys_asm.c -o sys_asm -m32 來編譯, 然后使用./sys_asm運行.
上面的程序的執行結果是:
分別表示匯編代碼運行的結果, 以及API運行的結果. 我們可以看到結果是一樣的.