系統呼叫介面往往是通過中斷來實現,比如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上全是妹妹的頭像 三 課餘活動豐富,打球 唱歌 泡妞 ...
第十二章 程式設計師的恐懼感
第十二章 程式設計師的恐懼感 你看過韓劇 大長今 嗎?如果沒有看過,那麼建議你看看。我自己就看過好幾遍,特別是從長今學醫開始的那一段。我們能從長今身上學到些什麼?也許很多人會說學到了成長的艱辛,不屈不撓的精神等等。可我現在要說的,卻是長今在宮中進行醫女培訓過程中,申益必教授對長今的評價 你不適合當醫...