Linux內(nèi)核學(xué)習(xí)之系統(tǒng)調(diào)用_第1頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、linux內(nèi)核學(xué)習(xí)之系統(tǒng)調(diào)用1. 系統(tǒng)調(diào)用概念 大家都知道操作系統(tǒng)的作用是管理計(jì)算機(jī)的軟硬件資源,但是操作系統(tǒng)要向用戶提供各式各樣的服務(wù),而用戶應(yīng)用程序拜訪這些服務(wù)的方式就是通過系統(tǒng)調(diào)用。但是普通來說,我們都是通過操作系統(tǒng)封裝好的api(應(yīng)用編程接口)來間接用法系統(tǒng)調(diào)用的。比如在windows編程中,你可以調(diào)用winapi,他以c庫的形式給出。比如在linux當(dāng)中,我們調(diào)用的read函數(shù):int read(int handle, vo *buf, int nbyte), 我們普通成為我們在用法系統(tǒng)調(diào)用read,由于相對應(yīng)標(biāo)準(zhǔn)c函數(shù)庫里面有一個fread。但是,事實(shí)上我們并沒有挺直的實(shí)現(xiàn)系統(tǒng)調(diào)用

2、,我們通過系統(tǒng)封裝的read函數(shù)去調(diào)用了read的系統(tǒng)調(diào)用。由于他們名字相同,是對應(yīng)的關(guān)系,所以我們很簡單誤會。但是系統(tǒng)調(diào)用和封裝的系統(tǒng)api函數(shù)并不是一一對應(yīng)的關(guān)系,比如系統(tǒng)的ecl、execlp、execle、execv、execvp、execve等都是通過execve系統(tǒng)調(diào)用來執(zhí)行一個可執(zhí)行文件的。系統(tǒng)調(diào)用終于必需有明確的操作,用戶應(yīng)用程序通過系統(tǒng)調(diào)用進(jìn)入內(nèi)核后,會執(zhí)行各個系統(tǒng)調(diào)用對應(yīng)的內(nèi)核函數(shù),即系統(tǒng)調(diào)用的服務(wù)例程。比如系統(tǒng)調(diào)用getpid的服務(wù)例程是內(nèi)核函數(shù)sys_getpid。 2. 系統(tǒng)調(diào)用表 內(nèi)核提供哪些內(nèi)核函數(shù)是對外可用的呢,換句話說內(nèi)核提供哪些系統(tǒng)調(diào)用的服務(wù)例程呢?這個在系

3、統(tǒng)調(diào)用表里面sys_call_table,他存儲了全部的系統(tǒng)調(diào)用對應(yīng)的服務(wù)例程的函數(shù)地址,在arch/i386/kernel/syscall_table.s文件中,如下: entry(sys_call_table) .long sys_restart_syscall /* 0 - old for restarting */ .long sys_exit .long sys_fork .long sys_read .long sys_ .long sys_open /* 5 */ .long sys_close .long sys_waitpid .long sys_creat .long sy

4、s_link .long sys_unlink /* 10 */ . .可以很清晰的看到,全部的系統(tǒng)調(diào)用都是遵循一定的命名規(guī)范的,即在系統(tǒng)名稱之前加 sys_ 前綴,比如exit系統(tǒng)調(diào)用對應(yīng)的系統(tǒng)服務(wù)函數(shù)為sys_exit。另外系統(tǒng)總共對外提供的系統(tǒng)調(diào)用服務(wù)是十分有限的,我們可以看到惟獨(dú)兩三百個而已。 3. 系統(tǒng)調(diào)用號 系統(tǒng)調(diào)用號是什么呢?上述的每個系統(tǒng)服務(wù)例程都有一個系統(tǒng)調(diào)用號,用戶是通過系統(tǒng)調(diào)用號來調(diào)用這些服務(wù)例程而不是通過系統(tǒng)調(diào)用的名稱。上述的系統(tǒng)調(diào)用表存儲了全部系統(tǒng)調(diào)用的服務(wù)例程的地址,系統(tǒng)調(diào)用的過程就是從系統(tǒng)調(diào)用表中獵取地址去執(zhí)行。那么系統(tǒng)調(diào)用符合就必定要和系統(tǒng)調(diào)用號聯(lián)系到一起,這就

5、涉及到另外一個文件,在ilude/asm-i386/unistd.h文件。 define _nr_restart_syscall 0 define _nr_exit 1 define _nr_fork 2 define _nr_read 3 define _nr_write 4 define _nr_open 5 define _nr_close 6 define _nr_waitpid 7 define _nr_creat 8 define _nr_link 9 define _nr_unlink 10跟上述的系統(tǒng)調(diào)用表一比較,發(fā)覺除了前綴一個是sys_一個是_nr_外,他們的名稱是千篇一律

6、的,而且關(guān)鍵他們的挨次也是相同的。不錯,內(nèi)核就是將系統(tǒng)調(diào)用號作為下標(biāo)去獵取系統(tǒng)調(diào)用表中的系統(tǒng)調(diào)用服務(wù)例程的函數(shù)地址的。 4. 系統(tǒng)調(diào)用服務(wù)例程 全部的系統(tǒng)調(diào)用服務(wù)例程集中聲明在include/linux/syscal.h這個文件當(dāng)中,但是他們的定義分布在不同的文件中。比如getpid系統(tǒng)調(diào)用,他的系統(tǒng)服務(wù)例程sys_getpid在kernel/r.c文件中定義: asmlinkage long sys_getpid(void) return current- tgid; asmlinkage標(biāo)志的含義是僅從堆棧中獵取該數(shù)據(jù),不從寄存器及其他地方獵取。 5. 系統(tǒng)調(diào)用的用法 (1). 通過調(diào)用c

7、語言庫封裝函數(shù),比如前面所述的read函數(shù)。 (2). 通過syscall函數(shù),原型為int syscall(int number, .)。 詳細(xì)可以通過以下getpid的系統(tǒng)調(diào)用來展示系統(tǒng)調(diào)用的用法。 include unistd.h include sys/syscall.h include sys/types.h /可以從系統(tǒng)調(diào)用號文件中查看 define _nr_gettid 224 int main() pid_t = tid; tid = syscall(_nr_gettid); printf( call gettid through syscall function, gettid is %dn , tid); tid = getpid(); printf( call gettid through getpid function, gettid is %dn , tid); return 0; 另外大部分的系統(tǒng)調(diào)用都包含了一個sys_符號常量的宏定義來制定調(diào)用號,所以上述syscall函數(shù)也可以采納如下方式: tid = syscall(sys_gettid); 6. 為什么要用法系統(tǒng)調(diào)用 (1)系統(tǒng)調(diào)用可以為用戶空間提供拜訪硬件資源的統(tǒng)一接口,以至于應(yīng)用程序不必理睬詳細(xì)硬件拜訪操作。比如,讀寫文件時,應(yīng)用程序不用去關(guān)懷

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論