Linux內核分析實驗4——系統調用

CPU工作狀態分爲內核態與用戶態,他們的執行的指令的權限不同,用戶態程序不能訪問0xb00000以後的的內存(虛擬內存)
系統內核會提供一些系統調用,它們執行一些底層的,有關硬件的功能,出於安全與兼容的考慮,用戶態程序無法訪問硬件,需要通過系統調用來實現一些功能,如獲取當前事件,在屏幕上顯示等。
操作系統提供了一些系統api以供程序調用,一個系統api可能調用多個系統調用,一個系統調用也可能有多個系統api使用。
我們在程序中可以調用系統api實現某些功能,也可以直接使用系統調用
調用api:

#include <time.h>

int main()
{
    time_t tt;
    struct tm *t;
    tt=time();
    t=localtime(&tt);
    printf("time:%d:%d:%d:%d:%d:%d\n",t->tm_year+1900, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
    return 0;
}

使用系統調用

    time_t tt;
    struct tm *t;
    asm volatile(
        "mov $0,%%ebx\n\t"
        "mov $0xd,%%eax\n\t" 
        "int $0x80\n\t" 
        "mov %%eax,%0\n\t"  
        : "=m" (tt) 
    );
    t = localtime(&tt);
    printf("time:%d:%d:%d:%d:%d:%d\n",t->tm_year+1900, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
    return 0;

使用系統調用,需要使用匯編,用法解釋如下
“`

 /*
設置ebx爲0,ebx爲系統調用的第一個參數,如果有第二個第三個參數,以此存放在ecx,edx,等通用寄存器中,若參數太多,最後一個存放多餘參數的指針
 */
  "mov $0,%%ebx\n\t"
     /*
eax爲系統調用號,即告訴系統要調用那個系統調用,0xd爲獲取當前時間
 */
    "mov $0xd,%%eax\n\t" 
    /*
    調用0x80中斷,即開始系統調用
    */
    "int $0x80\n\t" 
    /*
    系統調用的結果會存放在eax中
    */
    "mov %%eax,%0\n\t"  
    : "=m" (tt) 

“`

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章