日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #3 如何编写内核模块

發布時間:2025/3/20 linux 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #3 如何编写内核模块 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

HACK #3 如何編寫內核模塊

本節將介紹向Linux內核中動態添加功能的結構—內核模塊的編寫方法。
內核模塊
Linux內核是單內核(monolithic kernel),也就是所有的內核功能都集成在一個內核空間內。但是內核具有模塊功能,可以將磁盤驅動程序、文件系統等獨立的內核功能制作成模塊,并動態添加到內核空間或者刪除。
內核模塊是可以動態添加到Linux內核空間的二進制文件,文件擴展名為ko。
內核模塊的編寫方法大致有兩種。一種是將內核源碼樹帶有的功能編寫為模塊的方法(參考Hack #2),另一種是將內核源碼樹中所沒有的特有功能編寫為模塊的方法。
通過內核配置編寫模塊
把內核源代碼文件中CONFIG_*=m的項目所對應的驅動程序編寫為模塊。編寫生成的模塊一般安裝在/lib/modules/內核版本/kernel下。
以RHEL6為例

# ls /lib/modules/2.6.32-71.29.1.el6.x86_64/kernel/ arch crypto drivers fs kernel lib mm net sound

編寫特有的內核模塊
下面將介紹如何編寫內核源碼樹中所沒有的特有內核模塊。
以mymod模塊為例說明,請將下面的代碼以mymod.c為文件名保存。

#include <linux/module.h> #include <linux/timer.h> #include <linux/errno.h>static int sec = 5; module_param(sec, int, S_IRUGO|S_IWUSR); MODULE_PARM_DESC(sec, "Set the interval.");static void mymod_timer(unsigned long data);static DEFINE_TIMER(timer, mymod_timer, 0, 0);static void mymod_timer(unsigned long data) {printk(KERN_INFO "mymod: timer\n");mod_timer(&timer, jiffies + sec * HZ); }static int mymod_init(void) {printk(KERN_INFO "mymod: init\n");if (sec <= 0) {printk(KERN_INFO "Invalid interval sec=%d\n", sec);return -EINVAL;}mod_timer(&timer, jiffies + sec * HZ);return 0; }static void mymod_exit(void) {del_timer(&timer);printk(KERN_INFO "mymod: exit\n"); }module_init(mymod_init); module_exit(mymod_exit);MODULE_AUTHOR("Hiroshi Shimamoto"); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("My module");

在模塊的源代碼中包含(include)頭文件linux/module.h。
名為module_int()和module_exit()的宏,可以調用回調(callback)函數來進行初始化和終止模塊的處理。在模塊的源文件中進行如下描述,就可以在添加模塊時調用初始化函數,在刪除模塊時調用終止函數。
module_init(初始化函數名);
module_exit(終止函數名);
在這個例子模塊的情形下調用的分別是mymod_init()和mymod_exit()。
初始化函數為了表示初始化已正常完成,需要返回0。按照Linux內核中的寫法,發生錯誤(error)時將返回一個值為負數的錯誤代碼。在這個例子中,如果設定值出錯,則處理為-EINVAL(非法值)。
下面先用3個宏對模塊進行定義,但在模塊編寫中并不是必需的。

這個例子模塊還用到了模塊參數。模塊參數可以使用module_param()宏來生成。
module_param(參數名,參數類型,權限(permission));
在例子模塊中,sec定義為int類型的模塊參數。
另外,還可以使用MODULE_PARM_DESC()宏來對模塊參數進行說明。
先簡單介紹一下這個例子的運行過程。當添加模塊時,會調用指定為初始化函數的mymod_init()。在mymod_init()中首先通過printk()輸出:
mymod: init
然后確認模塊參數sec是否正常。在模塊參數sec的值為0以下的異常情形時,會返回EINVAL錯誤代碼并終止程序。在判斷模塊參數sec正常后,將內核計時器設置為sec秒后啟動超時(timeout)函數mymod_timer()。在每隔sec秒啟動的mymod_timer()中,首先使用printk()輸出:

mymod: timer

再次設置sec秒的內核計時器,然后終止。當刪除模塊時,會調用mymod_exit()函數,刪除內核計時器,通過printk()輸出:

mymod: exit

于是模塊終止。
接下來需要準備編寫模塊所需的Makefile。由于是使用內核的創建框架來生成,因此Makefile的內容非常簡單。

obj-m :=mymod.o

最后執行下列make命令,通過當前目錄(current directory)的源代碼和Makefile生成模塊mymod.ko。

# make -C /lib/modules/'uname 杛'/build M='pwd'

通過使用modinfo命令,可以看到所生成模塊mymod.ko的信息。從這里可以看到使用MODULE_*宏所指定的內容。

# modinfo mymod.ko filename: mymod.ko description: My module license: GPL author: Hiroshi Shimamoto srcversion: 61A3BB7CFC0C89B8344F5A5 depends: vermagic: 2.6.32-71.29.1.el6.x86_64 SMP mod_unload modversions parm: sec:Set the interval. (int)

添加內核模塊
添加內核模塊需要用到insmod命令或modprobe命令。
通過執行insmod命令把生成的mymod.ko模塊添加進來。

# insmod mymod.ko

使用dmesg命令,可以看到例子模塊mymod.ko的輸出內容。

# dmesg | tail: mymod: init

作為模塊初始化函數mymod_init()所調用的printk()的輸出內容會在最后一行顯示。
使用lsmod可以顯示目前添加到內核中的模塊列表。

# lsmod Module Size Used by mymod 1482 0 :

可以看到,mymod行存在,模塊已添加。
要將已添加的模塊從內核空間刪除時,可以使用rmmod命令。

# rmmod mymod

執行rmmod命令后,模塊將從內核空間內刪除,使用lsmod命令就不會再輸出mymod行。
此外,使用dmesg命令還可以看到終止模塊的處理中printk()輸出的信息mymod: exit。

# dmesg | tail: mymod: exit

下面針對模塊參數作一些介紹。在添加模塊后,就會在/sys/module下生成對應的目錄和文件。

# ls /sys/module/mymod/

holders initstate notes parameters refcnt sections srcversion
可以確認在parameters下生成的模塊mymod中所定義的參數sec。

# ls -l /sys/module/mymod/parameters/sec

-rw-r--r--. 1 root root 4096 May 15 06:34 /sys/module/mymod/parameters/sec
其內容應當是初始值5。

# cat /sys/module/mymod/parameters/sec

5
模塊參數可以在使用insmod添加模塊時對值進行指定。

# insmod mymod.ko sec=10

進行上述操作后,添加mymod.ko時模塊參數sec就為10,默認間隔5秒的超時變成間隔10秒。
小結
本節介紹了內核模塊的編寫方法。編寫特有內核模塊是Kernel構建的入門級操作,你也可以嘗試一下。
參考文獻
Documentation/kbuild/modules.txt
—Hiroshi Shimamoto

總結

以上是生活随笔為你收集整理的《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #3 如何编写内核模块的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费看久久 | 伊人成人在线观看 | 丝袜一级片 | 国内一区二区视频 | 国产在线你懂得 | 日韩视频中文字幕在线观看 | 伊人久久青青 | 91精品国产免费 | 91成人福利视频 | 婷婷亚洲激情 | 亚洲一区二区三区 | 欧美呦交 | 国产97色| 五月婷婷激情综合网 | 三级在线观看 | 最新av在线 | 天天插夜夜爽 | 免费a级片在线观看 | 欧美精品色哟哟 | 国产精品成人av性教育 | 亚洲人妻一区二区三区 | 中文字幕在线播放一区二区 | 欧美性猛交久久久乱大交小说 | 男人插女人下面视频 | 懂色av一区二区三区在线播放 | 性高跟丝袜xxxxhd | 精品成人免费一区二区在线播放 | 国产乱仑 | 国产免费内射又粗又爽密桃视频 | 91天堂素人 | 久久综合99 | 欧美mv日韩mv国产 | 少妇人妻偷人精品无码视频新浪 | 激情四射婷婷 | 一区二区三区激情 | 黄色资源在线 | 91av国产精品 | 手机av免费看 | 男生女生羞羞网站 | 日韩精品免费在线 | 91天天 | 日本少妇久久久 | 亚洲成人精品 | 93看片淫黄大片一级 | 一区二区三区不卡在线观看 | 亚洲午夜精品一区二区三区 | 国产精品第三页 | 国产精品久久久久久亚洲伦 | 日韩精彩视频 | 亚洲区 欧美区 | 美日韩一区 | 亚欧三级 | 精品女厕偷拍一区二区 | 亚洲av无码一区二区三区四区 | 91美女高潮出水 | 欧美一区二区三区黄片 | 中文字幕一区二区三三 | 黄色三级在线播放 | 99热在线免费| 亚洲影视中文字幕 | 亚洲日本护士毛茸茸 | 国产精品久久久久久久免费大片 | 日韩在线观看精品 | 啪啪激情网 | 吊侵犯の奶水授乳羞羞漫画 | 豆花视频成人 | 色诱久久av | 人妻少妇精品视频一区二区三区 | 国产第9页 | 亚洲中文字幕一区 | 色爱综合网 | 天天在线免费视频 | 一区二区视频免费在线观看 | 日韩视频精品在线 | 少妇高潮一区二区三区99刮毛 | 鲁啊鲁在线视频 | 欧美色图30p | 丁香网五月天 | 日韩另类在线 | 性欧美大战久久久久久久免费观看 | 国产av电影一区二区三区 | 久久久视屏 | 天天综合天天做天天综合 | 波多野结衣黄色 | av体验区 | 亚洲精品视频一区二区 | 在线免费看污视频 | 欧美国产日韩一区二区 | 加勒比成人av | 日本一道在线 | 国产99对白在线播放 | 爱爱网站免费 | 成人在线视频免费 | 偷偷久久 | 久久影院午夜理论片无码 | 91黄色入口 | 国产成人黄色片 | 欧美在线亚洲 | 牛牛影视一区二区三区 |