Linux核心分析實驗4 系統呼叫

2021-07-28 09:34:20 字數 1114 閱讀 9776

cpu工作狀態分為核心態與使用者態,他們的執行的指令的許可權不同,使用者態程式不能訪問0xb00000以後的的記憶體(虛擬記憶體)

系統核心會提供一些系統呼叫,它們執行一些底層的,有關硬體的功能,出於安全與相容的考慮,使用者態程式無法訪問硬體,需要通過系統呼叫來實現一些功能,如獲取當前事件,在螢幕上顯示等。

作業系統提供了一些系統api以供程式呼叫,乙個系統api可能呼叫多個系統呼叫,乙個系統呼叫也可能有多個系統api使用。

我們在程式中可以呼叫系統api實現某些功能,也可以直接使用系統呼叫

呼叫api:

#include 

int main()

使用系統呼叫

time_t tt;

struct tm *t;

asmvolatile(

"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)

Linux核心分析 實驗二

該實驗要求完成乙個簡單的時間片輪轉多道程式核心 首先我們看看mykernel裡面的mypcb.h define max task num 10 max num of task in system define kernel stack size 1024 8struct thread typedef...

Linux核心分析實驗三

使用gdb 跟蹤除錯核心從 start kernel 到init 程序啟動 使用gdb 跟蹤除錯核心 開啟 shell 終端,執行以下命令 cdlinuxkernel qemu kernellinux 3.18.6 arch x86 boot bzimage initrd rootfs.img s ...

Linux核心分析 實驗四

當我們使用某些庫函式的api時,實際上該庫函式啥都沒乾,它只是乙個系統呼叫的封裝。x86為例,系統呼叫會執行int 0x80指令,也就是陷入。作業系統會變為核心態,查詢系統呼叫表,跳轉到相應的系統呼叫。每個系統呼叫都對應乙個唯一的系統呼叫號,系統呼叫之前,會從eax暫存器讀系統呼叫號,系統呼叫的返回...