1、首先确保系统安装了gcc和make编译环境,可以通过gcc --version,make --version命令查看
2、创建一个文件夹,里面主要放两个文件myDriver.c和用于编译myDriver.c的Makefile文件。
![](https://i-blog.csdnimg.cn/blog_migrate/42768bb8418bf5a5c4642a57b53e0f91.png)
myDriver.c代码:
#include <linux/module.h>
#include <linux/init.h>
/*把上述的结构体告诉内核,所以要注册*/
int __init hello_init(void)
{
printk("hello_init!\n");
return 0;
}
void __exit hello_exit(void)
{
printk("hello_exit!\n");
}
module_init(hello_init); //加载入口函数,加载时调用
module_exit(hello_exit); //出口函数,卸载时调用
/*许可证*/
MODULE_LICENSE("GPL");
Makefile代码
ARCH := x86
KERNEL_VERSION :=$(shell uname -r)
KERNEL_DIR :=/lib/modules/$(KERNEL_VERSION)/build
all:
make -C $(KERNEL_DIR) M=$(shell pwd) modules
clean:
make -C $(KERNEL_DIR) M=$(shell pwd) modules clean
rm -rf modules.order build
obj-m +=myDriver.o
3、写好这两个文件之后就可以使用make命令进行编译,之后会生成各种文件,主要是myDriver.ko这个文件,把这个模块加载进驱动即可
![](https://i-blog.csdnimg.cn/blog_migrate/3557a9303bdaf0dccfcf65f80f0fae8c.png)
加载驱动模块insmod myDriver.ko
卸载驱动模块 rmmod myDriver 注意:这里是加载完成的驱动名,不是.ko文件名
查看驱动模块 lsmod
![](https://i-blog.csdnimg.cn/blog_migrate/309905566b2c02e0cc7df3480a7c4c43.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4dd22bfdd1a11fd2b252738ef48cb08d.png)
4、查看内核打印dmesg
![](https://i-blog.csdnimg.cn/blog_migrate/a8f1fa10f8d1be330c0cb8fb8e6abde8.png)
5、清除编译生成的文件,方便下次重新编译,使用make clean命令
![](https://i-blog.csdnimg.cn/blog_migrate/28cb5f805b21952110e4de881cfaff76.png)
扩展:加载.ko驱动模块有两种方式,除了上文使用的方法,还可以使用modprobe命令,具体实现如下:
1、将myDriver.ko文件拷贝到/lib/modules/$(uname -r)目录下,uname -r 即为你系统的内核版本
![](https://i-blog.csdnimg.cn/blog_migrate/42bee661500440eba82b99b1df86822c.png)
2、然后输入depmod命令,最后执行modprobe myDriver ,注意不要加.ko
![](https://i-blog.csdnimg.cn/blog_migrate/3fddc526979d6847e47256e66d4cee68.png)
3、输入dmesg查看内核打印
![](https://i-blog.csdnimg.cn/blog_migrate/4477890fcd96c78f7f6b8e31da776a29.png)
modprobe和insmod类似,都是用来动态加载驱动模块的,区别在于modprobe可以解决load module的依赖关系,而insmod不能解决依赖关系,卸载同样使用rmmod myDriver即可。