程式設計師的自我修養 第十二章 系統呼叫與API

2022-07-03 19:24:14 字數 3024 閱讀 4712

系統呼叫介面往往是通過中斷來實現,比如linux使用0x80號中斷作為系統呼叫的入口,windows採用0x2e號中斷作為系統呼叫的入口。

eax名字

c語言定義

含義引數

1exit

void _exit(int status)

退出程序

ebx表示退出碼

2fork

pid_t fork(void)

複製程序

ebx表示複製引數

3read

ssize_t read( int fd,

void    *buf,

size_t  count)

讀檔案ebx表示檔案控制代碼,ecx表示讀取緩衝位址,edx表示讀取的大小

4write

ssize_t write( int fd,

const void *buf,

size_t   count);

寫檔案同sys_read

5open

int open(

const char *path

int flags,

mode_t mode);

開啟檔案

ebx表示檔案路徑,ecx表示開啟檔案的模式,edx也表示開啟的模式

...我們可以通過系統呼叫open()、read()和close()來繞過glibc的fopen()、fread()、fclose()。

/*sys_call_01.c*/

#include

int main()

char buffer[64];

char buffer_r[64];

char *error_message = "open file error \n";

char *success_message = "open file success \n";

char *message = "please input something\n";

write(0,message,strlen(message));

int r_len = read(1,buffer_r,64);

buffer_r[r_len] = '\0';

printf("read_len = %d \t buffer_read = %s \n",r_len,buffer_r);

int fd = open("readme.txt",0,0);

if(fd == -1)

write(0, error_message, strlen(error_message));

return -1;

write(0,success_message, strlen(success_message));

read(fd, buffer,64);

printf("buffer: %s\n",buffer);

close(fd);

return 0;

注:stdin,stdout, stderr 的檔案描述符分別為'0','1','2'

$ ./sys_call_01

please input something

read from stdin

read_len = 16    buffer_read = read from stdin

open file success

buffer: this is a test!

this is a test!

this is a test!

this is a tes/

在不同的系統中,系統呼叫是不相同的,為了統一,各種程式語言提供了執行庫的介面來統一相同的功能。

比如,c語言裡面的fread,用於讀取檔案,在windows下這個函式的實現可能是呼叫readfile這個api,而如果在linux下則很可能呼叫read這個系統呼叫。但不在管哪個平台,我們都可以使用c語言執行庫的fread來讀取檔案。

執行時庫將不同的作業系統的系統呼叫包裝為統一固定的介面,使得同樣的**,在不同的作業系統下都可以直接編譯,並產生一致的效果。這就是源**級上的可移植性。

中斷一般有兩個屬性,乙個稱為中斷號(從0開始),乙個稱為中斷處理程式(interrupt service routine,isr)。不同的中斷具有不同的中斷號,而同時乙個中斷處理程式一一對應乙個中斷號。在核心中,有乙個陣列稱為中斷向量表(interrupt vector table),這個陣列的第n項包含了指向第n個中斷的中斷處理程式的指標。

乙個函式指標的陣列:

cpu中斷過程

基於int的linux的經典系統呼叫實現:

觸發中斷     2.    切換堆疊     3.    中斷處理程式

在2.6的核心裡面沒有找到_syscall0

windows api

乙個普通的fwrite()的呼叫路徑:

windows api現在的數量很龐大,按照功能被劃分為幾大類:

所以不管核心如何改變介面,只要維持api層面的介面不變,理論上所有的應用程式都不用重新編譯就可以正常執行,這也是windows api存在的主要原因。

對於第下一章的內容暫時不轉上來了,我只看了c的執行庫的設計,基本上看懂了,什麼時候來好好學習一下!

程式設計師的自我修養 第十二章 系統呼叫與API

系統呼叫介面往往是通過中斷來實現,比如linux使用0x80號中斷作為系統呼叫的入口,windows採用0x2e號中斷作為系統呼叫的入口。eax名字 c語言定義 含義引數 1exit void exit int status 退出程序 ebx表示退出碼 2fork pid t fork void 複...

瘋狂的程式設計師 第十二章

現在來看,王江應該是屬於那種成功的大學生。好多人後來都後悔 四年大學白念了,什麼也沒學到,什麼也沒做成。在他們心目中,大學四年應該像王江那樣渡過 一 成績中上,另外有那麼一兩門課特別好 二 交際廣泛,特別是跟女同學的交際,手機裡面全是妹妹的 qq上全是妹妹的頭像 三 課餘活動豐富,打球 唱歌 泡妞 ...

第十二章 程式設計師的恐懼感

第十二章 程式設計師的恐懼感 你看過韓劇 大長今 嗎?如果沒有看過,那麼建議你看看。我自己就看過好幾遍,特別是從長今學醫開始的那一段。我們能從長今身上學到些什麼?也許很多人會說學到了成長的艱辛,不屈不撓的精神等等。可我現在要說的,卻是長今在宮中進行醫女培訓過程中,申益必教授對長今的評價 你不適合當醫...