內核的模塊
第一步:編寫一個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=205. 用gcc 編譯後連接到庫文件,到用戶的腳本,和用戶的運行時環境,所以內核編譯不能用gcc 啦。
6.系統調用和標準庫在內核中都不能調用