1, 选择框架
用的是Char字符驱动框架。
2. 放置位置
自己建立一个文件夹,然后将如下2个文件添加即可。
3. 运行方式
在ubuntu中运行和在开发板上运行,在代码上唯一区别就是Makefile文件中KERNELDIR指向的kernel原始路径不同。
编译模块的命令为
make
若需要加载到arm开发板,编译模块的命令为
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules
4. 使用ko模块
最后生成hello.ko文件。
输入insmod hello.ko 加载模块
然后lsmod | grep ‘hello’ 能找到此刚加入的模块
最后rmmod hello.ko 卸载模块
5.参考代码
5.1 Hello.c驱动文件
#include<linux/init.h> //模块加载卸载需要的头文件
#include<linux/module.h> //需要内核的一些认证和许可
// 上面两个头文件对一个内核模块程序来说是必不可少的
//这是模块初始化函数,在模块加载时触发被调用
static int __init hello_init(void)
{
printk("hello world module init!\n");
return 0;
}
//这是模块收尾处理函数,在模块卸载时触发被调用
static void __exit hello_exit(void)
{
printk("hello world module exit!\n");
}
//下面这两个相当于是注册函数,用来加载模块和卸载模块时触发的
module_init(hello_init);
module_exit(hello_exit);
//模块加载时一个许可认证,如果没有编译的时候会报警告
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("YU ZHI HUI"); //额外的信息,模块作者信息
5.2 Makefile文件
obj-m := hello.o
#KERNELDIR := /lib/modules/4.4.0-31-generic/build
KERNELDIR := /home/study/test/board-support/linux-sdk
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
网友评论