資源描述:
《置頂linux系統(tǒng)調(diào)用》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、置頂linux系統(tǒng)調(diào)用5.1.5如何使用系統(tǒng)調(diào)用如圖5.2所示,用戶應(yīng)用可以通過兩種方式使用系統(tǒng)調(diào)用。第一種方式是通過C庫函數(shù),包括系統(tǒng)調(diào)用在C庫中的封裝函數(shù)和其他普通函數(shù)。第二種方式是使用_syscall宏。2.6.18版本之前的內(nèi)核,在include/asm-i386/unistd.h文件中定義有7個_syscall宏,分別是:其中,type表示所天生系統(tǒng)調(diào)用的返回值類型,name表示該系統(tǒng)調(diào)用的名稱,typeN、argN分別表示第N個參數(shù)的類型和名稱,它們的數(shù)目和_syscall后面的數(shù)字一樣大。這些宏的作用是創(chuàng)建名為name的函數(shù),_syscall后面跟的數(shù)字指明了該函
2、數(shù)的參數(shù)的個數(shù)。比如sysinfo系統(tǒng)調(diào)用用于獲取系統(tǒng)總體統(tǒng)計信息,使用_syscall宏定義為:展開后的形式為:可以看出,_syscall1(int,sysinfo,structsysinfo*,info)展開成一個名為sysinfo的函數(shù),原參數(shù)int就是函數(shù)的返回類型,原參數(shù)structsysinfo*和info分別構(gòu)成新函數(shù)的參數(shù)。在程序文件里使用_syscall宏定義需要的系統(tǒng)調(diào)用,就可以在接下來的代碼中通過系統(tǒng)調(diào)用名稱直接調(diào)用該系統(tǒng)調(diào)用。下面是一個使用sysinfo系統(tǒng)調(diào)用的實例。代碼清單5.1sysinfo系統(tǒng)調(diào)用使用實例00#includestdio.h01#i
3、ncludestdlib.h02#includeerrno.h03#includelinux/unistd.h04#includelinux/kernel.h0506_syscall1(int,sysinfo,structsysinfo*,info);0708intmain(void)09{10structsysinfos_info;11interror;1213error=sysinfo(&s_info);14printf("codeerror=%d",error);15printf("Uptime=%ldsLoad:1min%lu/5min%lu/15min%lu
4、n"16"RAM:total%lu/free%lu/shared%lu"17"Memoryinbuffers=%luSwap:total%lu/free%lu"18"Numberofprocesses=%d",19s_info.uptime,s_info.loads[0],20s_info.loads[1],s_info.loads[2],21s_info.totalram,s_info.freeram,22s_info.sharedram,s_info.bufferram,23s_info.totalswap,s_info.freeswap,24s_info.
5、procs);25exit(EXIT_SUCCESS);26}但是自2.6.19版本開始,_syscall宏被廢除,我們需要使用syscall函數(shù),通過指定系統(tǒng)調(diào)用號和一組參數(shù)來調(diào)用系統(tǒng)調(diào)用。syscall函數(shù)原型為:其中number是系統(tǒng)調(diào)用號,number后面應(yīng)順序接上該系統(tǒng)調(diào)用的所有參數(shù)。下面是gettid系統(tǒng)調(diào)用的調(diào)用實例。代碼清單5.2gettid系統(tǒng)調(diào)用使用實例大部分系統(tǒng)調(diào)用都包括了一個SYS_符號常量來指定自己到系統(tǒng)調(diào)用號的映射,因此上面第10行可重寫為:5.2系統(tǒng)調(diào)用執(zhí)行過程系統(tǒng)調(diào)用的執(zhí)行過程主要包括如圖5.3與圖5.4所示的兩個階段:用戶空間到內(nèi)核空間的轉(zhuǎn)換階
6、段,以及系統(tǒng)調(diào)用處理程序system_call函數(shù)到系統(tǒng)調(diào)用服務(wù)例程的階段。(1)用戶空間到內(nèi)核空間。如圖5.3所示,系統(tǒng)調(diào)用的執(zhí)行需要一個用戶空間到內(nèi)核空間的狀態(tài)轉(zhuǎn)換,不同的平臺具有不同的指令可以完成這種轉(zhuǎn)換,這種指令也被稱作操縱系統(tǒng)陷進(operatingsystemtrap)指令。Linux通過軟中斷來實現(xiàn)這種陷進,具體對于X86架構(gòu)來說,是軟中斷0x80,也即int[message]x80匯編指令。軟中斷和我們常說的中斷(硬件中斷)不同之處在于-它由軟件指令觸發(fā)而并非由硬件外設(shè)引發(fā)。int0x80指令被封裝在C庫中,對于用戶應(yīng)用來說,基于可移植性的考慮,不應(yīng)該直接調(diào)用i
7、nt[message]x80指令。陷進指令的平臺依靠性,也正是系統(tǒng)調(diào)用需要在C庫進行封裝的原因之一。通過軟中斷0x80,系統(tǒng)會跳轉(zhuǎn)到一個預(yù)設(shè)的內(nèi)核空間地址,它指向了系統(tǒng)調(diào)用處理程序(不要和系統(tǒng)調(diào)用服務(wù)例程相混淆),即在arch/i386/kernel/entry.S文件中使用匯編語言編寫的system_call函數(shù)。(2)system_call函數(shù)到系統(tǒng)調(diào)用服務(wù)例程。很顯然,所有的系統(tǒng)調(diào)用都會同一跳轉(zhuǎn)到這個地址進而執(zhí)行system_call函數(shù),但正如前面所述,到2.6.23?*梗諍頌峁┑南