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)
“`