編寫linux模塊(由淺入深)

開啓內核對模塊的支持

在編譯內核時確保開啓加載模塊支持。
Loadable module support --->
         [*] Enable loadable module support
         [*] Module unloading
         [ ] Module versioning support (EXPERIMENTAL)
         [*] Automatic kernel module loading
勾選如上選項,重新編譯安裝內核。

Hello module

首先確保運行的內核和源代碼版本一致。
進入linux源碼目錄drivers/misc/,創建文件mymodule.c, 代碼如下
#include <linux/module.h>
#include <linux/config.h>
#include <linux/init.h>
static int __init mymodule_init(void)
{
printk ("Hello module!\n");
return 0;
}
static void __exit mymodule_exit(void)
{
printk ("Unloading my module.\n");
return;
}
module_init(mymodule_init);
module_exit(mymodule_exit);
MODULE_LICENSE("GPL");
然後在同一個目錄下的Makefile文件追加一行
obj-m += mymodule.o

編譯
make -C <top directory of your kernel source> SUBDIRS=$PWD modules

加載
insmod ./mymodule.ko
成功會打印出 Hello module!

移除
rmmod mymodule


模塊和內核

現在來用模塊做一些有意思的事。
有一個關鍵是模塊只能訪問內核導出的函數和變量。示例如下:

在內核kernel/prink/printk.c中添加全局變量
int my_variable = 0;
重新編譯並重啓內核

在mymodule_init中添加如下代碼:
extern int my_variable;
printk ("my_variable is %d\n", my_variable);
my_variable++;
重現編譯並加載模塊

<span style="font-family: Arial, Helvetica, sans-serif;">這次出現了錯誤信息      insmod: error inserting './mymodule.ko': -1 Unknown symbol in module</span>
它的意思是內核不允許模塊訪問變量, 當模塊加載的時,它查找函數和變量的外部引用,my_variable變量一定是在內核中,只是沒有找到。
在prinkf.c my_variable下添加導出符號代碼
EXPORT_SYMBOL(my_variable);
問題解決。

加載模塊
my_variable is 0
Hello module!

再次重新加載
# rmmod mymodule && insmod ./mymodule.ko
打印:
Unloading my module.
my_variable is 1
Hello module!

模塊可以訪問內核中導出的函數和方法,權限很高。建議在虛擬機裏測試編寫代碼,因爲一不小心繫統就崩了。

模塊可以傳參(不詳細介紹)

# insmod module.ko [param1=value param2=value ...]

讓模塊支持中斷

未完成













發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章