模块20135304——刘世鹏
編譯生成新內(nèi)核
一、實(shí)踐原理
Linux模塊是一些可以作為獨(dú)立程序來編譯的函數(shù)和數(shù)據(jù)類型的集合。之所以提供模塊機(jī)制,是因?yàn)長inux本身是一個單內(nèi)核。單內(nèi)核由于所有內(nèi)容都集成在一起,效率很高,但可擴(kuò)展性和可維護(hù)性相對較差,模塊機(jī)制可彌補(bǔ)這一缺陷。
Linux模塊可以通過靜態(tài)或動態(tài)的方法加載到內(nèi)核空間,靜態(tài)加載是指在內(nèi)核啟動過程中加載;動態(tài)加載是指在內(nèi)核運(yùn)行的過程中隨時加載。
一個模塊被加載到內(nèi)核中時,就成為內(nèi)核代碼的一部分。模塊加載入系統(tǒng)時,系統(tǒng)修改內(nèi)核中的符號表,將新加載的模塊提供的資源和符號添加到內(nèi)核符號表中,以便模塊間的通信。
二、實(shí)踐過程
(一)簡單模塊——姓名
1.編寫模塊代碼
2.編譯模塊
接下來寫Makefile。
3、加載測試卸載模塊
?
?sudo insmod lsp.ko
dmesg
?
?
?
?
(二)進(jìn)程
1.編寫模塊代碼
模塊構(gòu)造函數(shù):執(zhí)行insmod或modprobe指令加載內(nèi)核模塊時會調(diào)用的初始化函數(shù)。函數(shù)原型必須是module_init(),括號內(nèi)是函數(shù)指針
模塊析構(gòu)函數(shù):執(zhí)行rmmod指令卸載模塊時調(diào)用的函數(shù)。函數(shù)原型是module_exit()
模塊許可聲明:函數(shù)原型是MODULE_LICENSE(),告訴內(nèi)核該程序使用的許可證,不然在加載時它會提示該模塊污染內(nèi)核。一般會寫GPL。
?
頭文件module.h,必須包含此文件;
頭文件kernel.h,包含常用的內(nèi)核函數(shù);
頭文件init.h包含宏_init和_exit,允許釋放內(nèi)核占用的內(nèi)存。
?
寫一個簡單的代碼,用來向內(nèi)核輸出進(jìn)程信息。
#include<linux/kernel.h> #include<linux/module.h> #include<linux/init.h> #include<linux/sched.h>static struct task_struct *pcurrent;static int __init print_init(void) {printk(KERN_INFO "print current task info\n");printk("pid\ttgid\tprio\tstate\n");for_each_process(pcurrent){printk("%d\t",pcurrent->pid);printk("%d\t",pcurrent->tgid);printk("%d\t",pcurrent->prio);printk("%ld\n",pcurrent->state);}return 0; } static void __exit print_exit(void) {printk(KERN_INFO "Finished\n"); }module_init(print_init); module_exit(print_exit);2.編譯模塊
接下來寫Makefile。
(其中,all到make的過程中要使用“回車+Tab”鍵)
obj-m:=proclist.o CURRENT_PATH:=$(shell pwd) LINUX_KERNEL_PATH:= /usr/src/linux-headers-3.13.0-32-generic all:make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules clean:make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean第一行:自己寫的.c的文件名+”.o”。
第三行的LINUX_KERNEL_PATH后面要寫你自己的內(nèi)核版本對應(yīng)的內(nèi)核源碼包地址.
解釋一下make命令:
make -C $(LINUX_KERNEL_PATH) 指明跳轉(zhuǎn)到內(nèi)核源碼目錄下讀取那里的Makefile
M=$(CURRENT_PATH) 表明返回到當(dāng)前目錄繼續(xù)執(zhí)行當(dāng)前的Makefile。
make之后的執(zhí)行時這樣的:
生成了好多文件:
3、加載模塊
sudo insmod proclist.ko
輸入密碼后即可。此時已經(jīng)加載了模塊。
4、測試模塊
Dmesg:看內(nèi)核信息
?
三、遇到的問題
1. linux的內(nèi)核版本
uname –r
?
位數(shù)
2.內(nèi)核位置
?
轉(zhuǎn)載于:https://www.cnblogs.com/L20135304/p/5531300.html
總結(jié)
以上是生活随笔為你收集整理的模块20135304——刘世鹏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Yslow on Nodejs serv
- 下一篇: 站立会议08