Linux驱动实践 带你一步一步编辑内核驱动程序
发布时间:2021-11-22 15:53:43 所属栏目:系统 来源:互联网
导读:别人的经验,我们的阶梯! 大家好,我是道哥。今天给大家分享一些笔记本里的一些存货: Linux 系统中的驱动和中断相关。 大概会用 6~7 篇的文章,由浅入深的为大家介绍Linux 中驱动程序的编写方法。 文章的顺序,也是我之前自己学习时的顺序。 以前的学习记录比
别人的经验,我们的阶梯! 大家好,我是道哥。今天给大家分享一些笔记本里的一些存货: Linux 系统中的驱动和中断相关。 大概会用 6~7 篇的文章,由浅入深的为大家介绍Linux 中驱动程序的编写方法。 文章的顺序,也是我之前自己学习时的顺序。 以前的学习记录比较零散,现在只是把它们按照一定的顺序重新梳理一下。 这几篇文章,理论知识会少一些,更注重实际的操作。 我会把操作用引导的代码,全部上传到网盘上,在文末有下载说明。 只要根据文中介绍的步骤进行操作,就一定可以操作成功。 学习的困惑 记得以前我在开始学习驱动开发的时候,找来很多文章、资料来学习,但是总是觉得缺少了点全局视角。 就好像:我想看清一座山的全貌,但总是被困在一个、又一个山谷中一样。 主要的困惑有 3 点: 每一篇文章的介绍都是正确的,但是如果把很多文章放在一起看,就会发现怎么说的都不一样啊? 有些文章注重函数的介绍,但是缺乏一个全局的视角,从整体上来观察驱动程序的结构; 对于一个新手来说,能够边学习、边实践,这是最好的学习方式,但是很多文章不会注意这方面。虽然文章内容很漂亮,但是不知道怎么去实践、验证。 因此,这几篇文章我们就从最简单的驱动模块编译开始,然后介绍字符设备驱动程序。 在这部分,会以 GPIO 为例子,重点描述其中的关键节点。 最后再介绍在中断处理程序中,如何利用信号量、小任务、工作队列,把内核事件传递到应用层来处理。 作为第一个开篇文章,从最简单的内核编译开始。 实际操作一下:如何把一个最简单的驱动程序(hello),按照 2 种方式进行编译: 编译进内核; 编译为一个独立的驱动模块; 实践环境 为了便于测试,以下操作都是在 Ubuntu16.04 操作系统里完成的。 编译Linux驱动程序,肯定需要内核源码,这里选择的是 linux-4.15 版本,可以在官网下载。 文末有下载方式。 下载之后,把linux-4.15.tar.gz解压到Ubuntu中任意目录即可,例如:解压到~/tmp/目录下: $ tar -zxvf linux-4.15.tar.gz -C ~/tmp/ 编译进内核 创建驱动程序目录 linux 中的驱动,一般都放在 linux-4.15/drivers/ 目录下,因此在这个目录中创建一个hello文件夹。 $ mkdir linux-4.15/drivers/hello 对于一个驱动来说,最重要的就是3个文件: 源代码 Kconfig Makefile 只要按照固定的格式来编写这3个文件,linux内核的编译脚本就可以确保把我们的驱动程序编译进去。 创建源文件 首先是源码,在hello文件夹中创建源文件 hello.c: $ cd linux-4.15/drivers/hello $ touch hello.c 源文件hello.c的内容是: #include <linux/module.h> #include <linux/init.h> // 当驱动被加载的时候,执行此函数 static int __init hello_init(void) { printk(KERN_ALERT "welcome, hello"n"); return 0; } // 当驱动被卸载的时候,执行此函数 static void __exit hello_exit(void) { printk(KERN_ALERT "bye, hellon"); } // 版权声明 MODULE_LICENSE("GPL"); // 以下两个函数属于 Linux 的驱动框架,只要把驱动两个函数地址注册进去即可。 module_init(hello_init); module_exit(hello_exit); 有两个小地方注意一下: 在内核中,打印函数是 printk,而不是 printf; 打印信息的级别有好几个,从 DEBUG 到 EMERG,这里使用的是 KERN_ALERT,方便查看打印信息。 创建 Kconfig 文件 这个文件是用来对内核进行配置的,当执行 make menuconfig 指令的时候,这个文件就被解析。 先创建文件: $ cd linux-4.15/drivers/hello $ touch Kconfig 添加如下内容: config HELLO tristate "hello driver" help just a simplest driver. default y 第一行内容 config HELLO ,在执行配置的时候,将会生成一个变量 CONFIG_HELLO ,而这个变量,将会在编译的时候,被 Makefile 引用。 最后一行的 default y ,就表示把 CONFIG_HELLO 的值设置成 y,从而让这个驱动被编译到内核中。 现在,hello驱动中的KConfig配置文件已经准备好了,但是还需要这个配置文件登记到 Linux 内核的整体配置文件中。 也就是把它登记在 linux-4.15/drivers/Kconfig 文件的末尾: source "drivers/hello/Kconfig" endmenu // 加在这一句的上面 现在,可以来执行下面指令,看一下具体的配置界面: $ cd linux-4.15/ $ make distclean $ make ARCH=x86_64 defconfig $ make ARCH=x86_64 menuconfig ![]() (编辑:阜新站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |