內核符號表和系統調用

轉自:http://bbs.ednchina.com/BLOG_ARTICLE_62710.HTM

驅動程序開發過程中涉及kernel symbol table syscall兩個概念,不知道大家是如何理解的,在此把我對二者理解羅列如下,給大家參考:


    內核符號表linux內核提供給內核代碼的一部分引用,所指的“內核代碼”包括內核以及驅動程序等運行在內核內存空間的程序,“引用”包括對變量的引用,對函數的引用等。最常見的內核符號引用如printk打印輸出。通常內核符號是由一部分內核代碼提供給其他內核代碼訪問其內部數據的接口。在驅動程序中,如果該驅動程序中有被其他內核代碼調用的部分,可以用EXPORT_SYMBOL導出到內核符號表中。


    在多層驅動模型如USBSCSI、文件系統中一般底層的驅動程序要導出其功能調用到內核符號表中,給上層驅動調用。


    系統調用是由基本內核提供的功能調用接口,所指的基本內核是不包括驅動程序,不能被隨意精簡的核代碼。系統調用的接口不僅運行於內核空間的代碼可以調用,用戶空間的程序同樣可以使用系統調用。系統調用的最初目的就是提供給用戶程序訪問操作系統的接口。最常見的系統調用如open,close,read,write等。


    用戶應用程序使用open(“/dev/null”)打開設備時,到底該系統調用完成了什麼功能?簡單的說,應用程序通知操作系統,需要打開/dev/null設備,成功後操作系統會返回設備句柄。至於操作系統爲了完成打開設備操作具體幹了寫什麼,可以參考內核代碼中sys_open的實現。


    內核符號表中的東西只能被內核空間程序訪問,系統調用無此限制。系統調用是最基本內核提供的代碼不能隨意添加或減少,而內核符號可以根據需要自行導出。


    還有一點值得注意的是,當在內核代碼中如驅動程序,發生了系統調用,系統調用的代碼是在該進程的用戶空間運行。這樣說還是有點模糊,舉個例子就清楚了。


進程test,虛擬設備/dev/readfile驅動程序模塊readfile.o,文件name.txt這三個對象。


Test.c中:


   Open(“/devreadfile”。。。) /*系統調用open,打開設備/dev/readfile*/


readfile.c的驅動程序中:


   open(“name.txt”。。。)   /*系統調用open,打開文件name.txt */


把前一個open命名位OPEN1,後一個爲OPEN2OPEN1系統調用運行於test進程的內存區,readfile.o的模塊代碼運行於內核空間,當發生系統調用OPEN2時,OPEN2其實也是運行於進程test的內存區。Test內存區是用戶空間,這點十分重要。不推薦在驅動代碼中使用系統調用,以防止死鎖。


 


系統調用不到300個,在/arch/i386/kernel/entry.S文件中定義,去掉前面的sys_

發佈了18 篇原創文章 · 獲贊 22 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章