内核的模块
第一步:编写一个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.系统调用和标准库在内核中都不能调用