①Linux模塊是一些能夠做爲獨立程序來編譯的函數和數據類型的集合。之因此提供模塊機制,是由於Linux自己是一個單內核。單內核因爲全部內容都集成在一塊兒,效率很高,但可擴展性和可維護性相對較差,模塊機制可彌補這一缺陷。 ②Linux模塊能夠經過靜態或動態的方法加載到內核空間,靜態加載是指在內核啓動過程當中加載;動態加載是指在內核運行的過程當中隨時加載。 ③一個模塊被加載到內核中時,就成爲內核代碼的一部分。模塊加載入系統時,系統修改內核中的符號表,將新加載的模塊提供的資源和符號添加到內核符號表中,以便模塊間的通訊。
#include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("Dual BSD/GPL"); static char *name =" fyj"; static int __init name_init(void) { printk("==hello,world==\n"); printk("==hello,%s\n",name); return 0; } static void __exit name_exit(void) { printk(KERN_INFO"name module exit\n"); } module_init(name_init); module_exit(name_exit); module_param(name,charp,S_IRUGO);
①模塊構造函數:執行insmod或modprobe指令加載內核模塊時會調用的初始化函數。函數原型必須是module_init(),括號內是函數指針
模塊析構函數:執行rmmod指令卸載模塊時調用的函數。函數原型是module_exit()linux
②模塊許可聲明:函數原型是MODULE_LICENSE(),告訴內核該程序使用的許可證,否則在加載時它會提示該模塊污染內核。通常會寫GPL。函數
頭文件module.h,必須包含此文件; 頭文件kernel.h,包含經常使用的內核函數; 頭文件init.h包含宏_init和_exit,容許釋放內核佔用的內存。
接下來寫Makefile。
測試
第一行:本身寫的.c的文件名+」.o」。 第三行的LINUX_KERNEL_PATH後面要寫你本身的內核版本對應的內核源碼包地址. 解釋一下make命令: make -C $(LINUX_KERNEL_PATH) 指明跳轉到內核源碼目錄下讀取那裏的Makefile M=$(CURRENT_PATH) 代表返回到當前目錄繼續執行當前的Makefile。
輸入make進行自動編譯
輸入sudo insmod lwr.ko,加載模塊(會要求輸入當前用戶的密碼),再輸入dmesg,測試模塊輸出
最後,輸入sudo rmmod fyj卸載以後,就將內核中以前加載的模塊刪除,這時用dmesg看內核信息,就會看到寫在module_exit()中的輸出。3d
在上述步驟的基礎上,能夠對內核模塊的.c文件進行修改以實現更多的功能
for_each_process()的函數本質即for循環,從第一個PCB(init_task)開始,順着pcurrent鏈表進行遍歷,輸出全部當前進程的信息(pid,tgid等)。指針
Makefile編寫以下
進行make以後,順利生成模塊,再進行sudo insmod lwr.ko,以後dmesg,就能夠查看進程鏈表的信息
code
本週按照老師的要求,作了一個空的模塊以後,再作一個系統調用或者遍歷。實驗過程當中較爲順利,沒有很大的困難。可是應該更加註重代碼的實際理解和運用。blog