使用匯編代碼調用系統調用


 

“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運行的結果. 我們可以看到結果是一樣的.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM