20135323符運錦----LINUX第二次實踐:內核模塊編譯

Linux實踐二--模塊

1、知識點總結

①Linux模塊是一些能夠做爲獨立程序來編譯的函數和數據類型的集合。之因此提供模塊機制,是由於Linux自己是一個單內核。單內核因爲全部內容都集成在一塊兒,效率很高,但可擴展性和可維護性相對較差,模塊機制可彌補這一缺陷。
②Linux模塊能夠經過靜態或動態的方法加載到內核空間,靜態加載是指在內核啓動過程當中加載;動態加載是指在內核運行的過程當中隨時加載。
③一個模塊被加載到內核中時,就成爲內核代碼的一部分。模塊加載入系統時,系統修改內核中的符號表,將新加載的模塊提供的資源和符號添加到內核符號表中,以便模塊間的通訊。

2、具體實踐

1.簡單實現

#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

2.內核模塊的功能實現

在上述步驟的基礎上,能夠對內核模塊的.c文件進行修改以實現更多的功能

for_each_process()的函數本質即for循環,從第一個PCB(init_task)開始,順着pcurrent鏈表進行遍歷,輸出全部當前進程的信息(pid,tgid等)。指針

Makefile編寫以下

進行make以後,順利生成模塊,再進行sudo insmod lwr.ko,以後dmesg,就能夠查看進程鏈表的信息
code

3、總結

本週按照老師的要求,作了一個空的模塊以後,再作一個系統調用或者遍歷。實驗過程當中較爲順利,沒有很大的困難。可是應該更加註重代碼的實際理解和運用。blog

相關文章
相關標籤/搜索