Linux设备驱动开发(LDD)学习笔记(一)

本文记录了使用LDD3书籍中的Hello World驱动程序在CentOS 7.4上进行Linux设备驱动开发的过程。内容包括安装内核头文件、创建软链接、编写驱动代码、制作Makefile、编译驱动以及加载和卸载驱动模块。遇到的主要问题是如何确保内核头文件版本与系统内核匹配,以避免加载驱动时出现错误。

使用的是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

https://www.cnblogs.com/Waming-zhen/p/4081713.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值