資源描述:
《Linux內(nèi)核中增加一個(gè)系統(tǒng)調(diào)用》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、選題要求:在Linux內(nèi)核中增加一個(gè)系統(tǒng)調(diào)用,并編寫對(duì)應(yīng)的linux應(yīng)用程序。利用該系統(tǒng)調(diào)用能夠遍歷系統(tǒng)當(dāng)前所有進(jìn)程的任務(wù)描述符,并按進(jìn)程父子關(guān)系將這些描述符所對(duì)應(yīng)的進(jìn)程id(PID)組織成樹形結(jié)構(gòu)顯示。目錄一.程序的主要設(shè)計(jì)思路,實(shí)現(xiàn)方式11.1添加系統(tǒng)調(diào)用的兩種方法11.1.1編譯內(nèi)核法11.1.2內(nèi)核模塊法11.2程序的主要設(shè)計(jì)思路11.3環(huán)境2二.程序的模塊劃分,及對(duì)每個(gè)模塊的說明22.1通過內(nèi)核模塊實(shí)現(xiàn)添加系統(tǒng)調(diào)用22.1.1修改系統(tǒng)調(diào)用的模塊22.1.2獲取sys_call_table的地址22.1.3清除內(nèi)存區(qū)域的寫保護(hù)32.2編寫系統(tǒng)調(diào)用指定自己的系統(tǒng)調(diào)用42.2.1內(nèi)核的
2、初始化函數(shù)42.2.2自己的系統(tǒng)調(diào)用服務(wù)例程42.2.3移除內(nèi)核模塊時(shí),將原有的系統(tǒng)調(diào)用進(jìn)行還原62.2.4模塊注冊(cè)相關(guān)62.3編寫用戶態(tài)的測(cè)試程序62.4編寫Makefile文件7三.所遇到的問題及解決的方法83.1進(jìn)程個(gè)數(shù)確定83.2被更改的系統(tǒng)調(diào)用號(hào)的選擇83.3獲取系統(tǒng)調(diào)用表的地址83.4內(nèi)核和用戶態(tài)數(shù)據(jù)交換8四.程序運(yùn)行結(jié)果及使用說明84.1將編譯出來的內(nèi)核模塊hello.ko加載到內(nèi)核中84.2通過dmesg查看輸出信息是否正確94.3運(yùn)行測(cè)試程序,輸出樹狀打印結(jié)果(部分結(jié)果截圖)94.4卸載自定義模塊10五.附錄115.1內(nèi)核模塊程序hello.c115.2測(cè)試程序hello
3、_test.c145.3Makefile文件14Linux內(nèi)核分析課程大作業(yè)一.程序的主要設(shè)計(jì)思路,實(shí)現(xiàn)方式1.1添加系統(tǒng)調(diào)用的兩種方法1.1.1編譯內(nèi)核法編寫好源碼之后·修改內(nèi)核的系統(tǒng)調(diào)用庫函數(shù)/usr/include/asm-generic/unistd.h,在這里面可以使用在syscall_table中沒有用到的223號(hào)·添加系統(tǒng)調(diào)用號(hào),讓系統(tǒng)根據(jù)這個(gè)號(hào),去找到syscall_table中的相應(yīng)表項(xiàng)。在/arch/x86/kernel/syscall_table_32.s文件中添加系統(tǒng)調(diào)用號(hào)和調(diào)用函數(shù)的對(duì)應(yīng)關(guān)系·接著就是my_syscall的實(shí)現(xiàn)了,在這里有兩種方法:第一種方法是在k
4、ernel下自己新建一個(gè)目錄添加自己的文件,但是要編寫Makefile,而且要修改全局的Makefile。第二種比較簡便的方法是,在kernel/sys.c中添加自己的服務(wù)函數(shù),這樣子不用修改Makefile.以上準(zhǔn)備工作做完之后,然后就要進(jìn)行編譯內(nèi)核了,以下是編譯內(nèi)核的一個(gè)過程1.makemenuconfig(使用圖形化的工具,更新.config文件)2.make-j3bzImage(編譯,-j3指的是同時(shí)使用3個(gè)cpu來編譯,bzImage指的是更新grub,以便重新引導(dǎo))3.makemodules(對(duì)模塊進(jìn)行編譯)4.makemodules_install(安裝編譯好的模塊)5.de
5、pmod(進(jìn)行依賴關(guān)系的處理)6.reboot(重啟看到自己編譯好的內(nèi)核)1.1.2內(nèi)核模塊法內(nèi)核模塊可以作為獨(dú)立程序來編譯的函數(shù)和數(shù)據(jù)類型的集合。之所以提供模塊機(jī)制,是因?yàn)長inux本身是一個(gè)單內(nèi)核。單內(nèi)核由于所有內(nèi)容都集成在一起,效率很高,但可擴(kuò)展性和可維護(hù)性相對(duì)較差,模塊機(jī)制可以彌補(bǔ)這一缺陷。Linux模塊可以通過靜態(tài)或動(dòng)態(tài)的方法加載到內(nèi)核空間,靜態(tài)加載是指在內(nèi)核啟動(dòng)過程中加載;動(dòng)態(tài)加載是指在內(nèi)核運(yùn)行的過程中隨時(shí)加載。一個(gè)模塊被加載到內(nèi)核中時(shí),就成為內(nèi)核代碼的一部分。模塊加載入系統(tǒng)時(shí),系統(tǒng)修改內(nèi)核中的符號(hào)表,將新加載的模塊提供的資源和符號(hào)添加到內(nèi)核符號(hào)表中,以便模塊間通信。這種方法是
6、采用系統(tǒng)調(diào)用攔截的一種方式,改變某一個(gè)系統(tǒng)調(diào)用號(hào)對(duì)應(yīng)的服務(wù)程序?yàn)槲覀冏约旱木帉懙某绦?,從而相?dāng)于添加了我們自己的系統(tǒng)調(diào)用。下面的內(nèi)容,會(huì)詳述用內(nèi)核模塊法實(shí)現(xiàn)目標(biāo)的過程。1.2程序的主要設(shè)計(jì)思路15Linux內(nèi)核分析課程大作業(yè)程序分三部分,一部分是通過內(nèi)核模塊實(shí)現(xiàn)添加系統(tǒng)調(diào)用,二是編寫系統(tǒng)調(diào)用指定自己的系統(tǒng)調(diào)用,最后是編寫用戶態(tài)的測(cè)試程序。1.3環(huán)境Ubuntu14.04+3.13.0內(nèi)核版本內(nèi)核版本:二.程序的模塊劃分,及對(duì)每個(gè)模塊的說明2.1通過內(nèi)核模塊實(shí)現(xiàn)添加系統(tǒng)調(diào)用這種方法其實(shí)是系統(tǒng)調(diào)用攔截的實(shí)現(xiàn)。系統(tǒng)調(diào)用服務(wù)程序的地址是放在sys_call_table中通過系統(tǒng)調(diào)用號(hào)定位到具體的系
7、統(tǒng)調(diào)用地址,那么我們通過編寫內(nèi)核模塊來修改sys_call_table中的系統(tǒng)調(diào)用的地址為我們自己定義的函數(shù)的地址,就可以實(shí)現(xiàn)系統(tǒng)調(diào)用的攔截。通過模塊加載時(shí),將系統(tǒng)調(diào)用表里面的那個(gè)系統(tǒng)調(diào)用號(hào)的那個(gè)系統(tǒng)調(diào)用號(hào)對(duì)應(yīng)的系統(tǒng)調(diào)用服務(wù)例程改為我們自己實(shí)現(xiàn)的系統(tǒng)歷程函數(shù)地址。2.1.1修改系統(tǒng)調(diào)用的模塊在/usr/include/i386-linux-gnu/asm/unistd_32.h文件中查看系統(tǒng)調(diào)用序號(hào):找到結(jié)果(部分截圖)