內核模塊基礎

內核的模塊

第一步:編寫一個hello.c文件

#include <linux/init.h>
#include <linux/module.h>/*內核中庫文件*/
 
MODULE_LICENSE("DUAL BSD/GPL");

static int num=300;
module_param(num,int,S_IRUGO);/*傳入可變參數,加載時傳入參數*/

static int  xtl_init(void)
{
 	printk("welcome to you\n");
	return 0;
}

static void  xtl_exit(void)
{
	printk("goodbye \n");
	return ;
}

module_init(xtl_init);
module_exit(xtl_exit);
MODULE_AUTHOR("XTL");

第二步:編寫一個makefile 文件

ifneq ($(KERNELRELEASE),)

obj-m :=hello.o
else

KDIR:=/lib/modules/2.6.28/build

all:
	make -C $(KDIR) M=`pwd` modules
#是調用KDIR路徑下的內核的makefile ,來編譯路徑M下的modules,生成hello.ko模塊
#`pwd`是大分號
clean:
	-rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif

執行make 命令生成文件中包含一個hello.ko

第三步:  $ insmod   hello.ko   加載hell.ko文件到內核中

$ lsmod        顯示存在的modules

$dmesg        顯示內核日誌信息,程序執行的結果會日誌中出現

$rmmod  hello   卸載hello模塊


今天遇到的問題:

1.`pwd` 是大分號 

2.ifneq not ifnep 

3.obj-m :=hello.o 的格式。

4.參數在加載時傳入 :insmod  hello.ko  num=20

5. 用gcc 編譯後連接到庫文件,到用戶的腳本,和用戶的運行時環境,所以內核編譯不能用gcc 啦。

6.系統調用和標準庫在內核中都不能調用


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