在学习资料满天飞的大环境下,知识变得非常零散,体系化的知识并不多,这就导致很多人每天都努力学习到感动自己,最终却收效甚微,甚至放弃学习。我的使命就是过滤掉大量的垃圾信息,将知识体系化,以短平快的方式直达问题本质,把大家从大海捞针的痛苦中解脱出来。
0 基础知识
在开始进入Linux内核驱动开发之前,我们先放松一下,罗列一些后续要用到的基础知识。一方面可以做一个零基础引导;另外一方面为了方便大家查阅,后续用到后不用到处去搜索了(这样很容易打算思路)。
0.1 什么是ko文件
因为我们马上要使用ko(Linux Kernel mOdule)文件,所以必须要提前说清楚什么是ko文件。说到ko文件必须要介绍内核的种类。当前内核通常被分为两类:单内核和微内核。
0.1.1 单内核
Linux内核就属于单内核结构。它是个单独的二进制大映象,模块间的通讯是通过直接调用其他模块中的函数实现的,而不是消息传递。优点是运行效率高,缺点是某个模块出现问题便会牵累整个内核,所以对开发人员的要求很高。
0.1.2 微内核
Mac OS X、Minix、Windows内核属于微内核结构。微核的目标是将系统服务的实现和系统的基本操作规则分离出来,放到用户态运行。由于内核只剩下进程管理、进程间通信、内存管理等基本功能,所以,微内核的设计更加简单。但是微内核的运行效率较单内核要低。
Linux为了弥补单内核太过庞大的缺点,采用了运行时加载模块(module)的方式,一个module就是一个ko文件。
0.2 驱动程序的分类
驱动程序的分类如下表所示:
驱动类型 | 说明 | 应用层操作接口 | 举例 |
---|---|---|---|
字符型设备驱动 | 按照 字节流 读写 | 虚拟文件 | 鼠标、键盘、串口等 |
块设备驱动 | 以 块 为单位进行读写 | 虚拟文件 | Nor/Nand Flash、EMMC卡、硬盘等 |
网络设备驱动 | 以 数据包 为单位进行读写 | Socket | 以太、Wifi、蓝牙等 |
0.3 什么是驱动框架
什么是 框架 ?我们去快递代收点取快递时,会遇到有两种代收点:一种是快递都堆在地上,老板到处翻着给你找的;还有一种是老板会设计好一个货架,各种快递按照种类、日期、收件人地址等信息整整齐齐摆放到货架上的。第一种就是没有框架,第二种就是有框架——货架+各种规则。
有框架的好处不言而喻。最核心的一点是——没有框架是做不大的。
0.4 热插拔
热插拔的实现并不能用一小节的内容一下子说明白,这里先引出来,后续会逐渐深入。
0.4.1 sysfs
从Linux2.6内核开始使用全新的设备模型——使用sysfs虚拟文件系统来管理系统中的设备。sysfs是与proc同类别的文件系统,它将系统中的设备组织成层次结构,并向用户态进程提供详细的内核数据结构信息。
0.4.2 Kobject
从Linux2.6内核开始通过 Kobject 这个数据结构令所有的设备在底层都具有统一的接口。Kobject提供基本的对象管理,每个在内核中注册的Kobject对象都会生成一个对应的目录在sysfs文件系统中。Kobject通常通过 Kset (具有同一类型的Kobject)将设备组织成层次化的结构。
0.4.3 udev/mdev机制
mdev是udev的简化版本,其实就是一个程序。我们在制作根文件系统时其实已经接触过了,可以温习一下。
链接:https://blog.csdn.net/weixin_44873133/article/details/109409831
它和sysfs、Kobject是如何配合实现热插拔的呢?
大体的流程是这样的:Kobject负责做“卧底”,它会安插在向内核注册的设备驱动中来“监视”它们,然后向“老大”sysfs汇报情况并记录在案。mdev/udev从“老大”这里得到确切的消息后实施“抓捕”——将设备节点“抓到”/dev这里“关起来”。
恭喜你又坚持看完了一篇博客,又进步了一点点!如果感觉还不错就点个赞再走吧,你的点赞和关注将是我持续输出的哒哒哒动力~~