使用的是LDD3那本书,第2章有一个hello world的简单驱动例子
下面讲下怎么编写/编译/运行这个例子
step 1
我的系统是CentOS Linux release 7.4.1708 (Core)
使用的Linux内核版本是 3.10.0-693.el7.x86_64
因为这是我在网上下载的centos镜像文件,里面没有Linux内核的源码啥的,
所以首先安装内核头文件
方法一 自动安装
使用以下命令安装
yum install kernel-headers
我的机器会出现以下提示
可以看出,即将安装的头文件版本3.10.0-1160.83.1.el7比当前系统版本3.10.0-693.el7要新。(这样子即使安装&编译成功,.ko文件也不能加载进内核,会报错insmod: ERROR: could not insert module hello_world.ko: Unknown symbol in module,我就是这样踩了第一个坑)。
请确保安装和当前运行系统对应版本的Linux内核头文件,如果不匹配就用方法二!
方法二 手动安装
(如果方法一显示的安装包和当前系统版本一致,请忽略手动安装的方法)
我是在网上下载的对应安装包,下载好后,手动安装:
rpm -ivh --force --nodeps kernel-devel-3.10.0-693.el7.x86_64.rpm
安装好后,在/usr/src/kernels/下就会出现对应的目录
step 2
设置软连接
ln -s /usr/src/kernels/3.10.0-693.el7.x86_64 /lib/modules/3.10.0-693.el7.x86_64/build
step 3
编写hello_world.c文件
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
static int __init hello_world_init(void)
{
printk(KERN_ALERT "hello world\n");
return 0;
}
static void __exit hello_world_exit(void)
{
printk(KERN_ALERT "bye world\n");
}
module_init(hello_world_init);
module_exit(hello_world_exit);
step 4
编写Makefile
obj-m+=hello_world.o
all:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) clean
step 5
执行make,进行编译
可以看出生成了hello_world.ko文件
step 6
用insmod hello_world.ko将驱动加载进内核,用lsmod查看驱动,然后用rmmod hello_world卸载驱动,最后执行dmesg可以看出加的日志信息。
参考文章
https://www.cnblogs.com/downey-blog/p/10500828.html
https://blog.youkuaiyun.com/BJTUYBYUAN/article/details/124466938
本文记录了使用LDD3书籍中的Hello World驱动程序在CentOS 7.4上进行Linux设备驱动开发的过程。内容包括安装内核头文件、创建软链接、编写驱动代码、制作Makefile、编译驱动以及加载和卸载驱动模块。遇到的主要问题是如何确保内核头文件版本与系统内核匹配,以避免加载驱动时出现错误。

被折叠的 条评论
为什么被折叠?



