C语言是基础
掌握相关预备知识
(1)硬件操作方面
(2)应用层API
驱动学习阶段
(1)注重实践,一步一步写驱动
(2)框架思维,多考虑整体和上下层
(3)先通过简单设备学linux驱动框架
(4)学会总结、记录,这会有助于理解
学习内容:
最近看奔跑吧Linux内核这一本书说道,要写好一个设备驱动程序需要具备如下知识技能,以下知识是书中的原话
1)了解Linux内核字符设备驱动程序的架构。
2)了解Linux内核字符设备驱动相关的API。
3)了解Linux内核内存管理的API。
4)了解Linux内核中断管理的API。
5)了解Linux内核中同步和锁等相关的API。
6)了解你所要编写驱动的芯片原理。
技能1:我们需要了解Linux字符设备驱动是如何组织的,应用程序是如何与一个驱动交互的。
技能2:这里面涉及字符设备的相关的基础知识,如字符设备的描述、设备号的管理、file_operations 的实现、ioctl 交互的设计和Linux设备模型管理等。
技能3:一个设备驱动程序不可避免地需要和内存打交道,如设备里的数据需要和用户程序交互、设备需要做DMA操作等。常见的应用场景有很多,如设备的内存需要映射到用户空间,然后和用户空间的程序做一个交互,这就会用到mmap这个API。mmap看似简单,实际却蕴藏了复杂的实现,而且很多API埋藏了不少“陷阱”。另外,DMA 操作也是一大难点,很多时候设备驱动程序需要分配和管理DMA buffer,这些部分都和内存管理有很大关系。
技能4:因为几乎所有的设备都支持中断模式,所以中断程序是设备驱动中一个不可或缺的部分。我们需要了解和熟悉Linux内核提供的中断管理相关的接口函数,例如,如何注册中断、如何编写中断处理程序等。
技能5:因为Linux是多进程、多用户的操作系统,而且支持内核抢占,进程间同步会变得很复杂,即使编写一个简单的字符设备驱动,也需要考虑同步和竞争的问题。
技能 6:设备驱动就是把设备运行起来,前面那些知识只不过是工具,真正让设备运行起来仍需要研究设备是如何工作的,这就需要驱动编写者认真地研究设备的芯片手册。
字符设备驱动管理的核心对象是以字符为数据流的设备。从Linux内核设计的角度来看,需要有一个数据结构来对其进行抽象和描述,这就是struct cdev数据结构。
<include/linux/cdev.h>
struct cdev {
struct kobject kobj;
struct module *owner;
const struct file_operations *ops;
struct list_head list;
dev_t dev;
unsigned int count;
};
kobj:用于Linux设备驱动模型。
owner:字符设备驱动程序所在的内核模块对象指针。
ops:字符设备驱动程序中最关键的一个操作函数,在和应用程序交互过程中起到桥梁枢纽的作用。
list:用来将字符设备串成一个链表。
dev:字符设备的设备号,由主设备号和次设备号组成。
count:同属一个主设备号的次设备号的个数。
设备驱动模型的底层架构
kobject
(1)定义在linux/kobject.h中
(2)各种对象最基本单元,提供一些公用型服务如:对象引用计数、维护对象链表、对象上锁、对用户空间的表示
(3)设备驱动模型中的各种对象其内部都会包含一个kobject
(4)地位相当于面向对象体系架构中的总基类
kobj_type
(1)很多书中简称为ktype,每一个kobject都需要绑定一个ktype来提供相应功能
(2)关键点1:sysfs_ops,提供该对象在sysfs中的操作方法(show和store)
(2)关键点2:attribute,提供在sysfs中以文件形式存在的属性,其实就是应用接口
struct sysfs_ops {
ssize_t (*show )(struct kobject *, struct attribute *,char *);
ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t);
};
show方法用于将传入的指定属性编码后放到char *类型的buffer中
store则执行相反功能:将buffer中的编码信息解码后传递给struct attribute类型变量。两者都是返回实际的属性长度
kset
(1)kset的主要作用是做顶层kobject的容器类
(2)kset的主要目的是将各个kobject(代表着各个对象)组织出目录层次架构
(3)可以认为kset就是为了在sysfs中弄出目录,从而让设备驱动模型中的多个对象能够有层次有逻辑性的组织在一起
(1)kset的主要作用是做顶层kobject的容器类
(2)kset的主要目的是将各个kobject(代表着各个对象)组织出目录层次架构
(3)可以认为 kset 就是为了在 sys 中弄出目录, 从而让设备驱动模型中的多个对象能够有层次有逻辑性的组织在一起。 kset 的作用可以把各个 kobject 组织成一个目录结构。
总的来说,这三个底层结构都是为了实现/sys 目录下的内容,kobject 实现最基本的内容,kobj_type 在于对目录里面的文件和对文件的操作, kset 就是构建目录层次结构。 三者共同实现了/sys 里面的基础架构。
参考了朱老师的课程,还有一个网友的播客https://blog.csdn.net/wangweijundeqq/article/details/101698028
如果侵权请联系我,谢谢