4月「掘金·日新计划」第18天
一、概念
1.1、驱动认识
- 裸机程序中是直接操控硬件的,操作系统中必须通过驱动来操控硬件。这两个的本质区别就是分层
- linux驱动本身做了模块化设计,linux驱动本身和linux内核不是强耦合的
- 驱动的设计中有一个关键数据结构(结构体) ,结构体中包含一些变量和一些函数指针 变量用来记录驱动相关的一些属性,函数指针用来记录驱动相关的操作方法 这些变量和函数指针加起来就构成了驱动。驱动就被抽象为这个结构体
- 一个驱动工作时主要就分几部分:驱动构建(构建一个struct mmc然后填充它) 驱动运行时(调用这些函数指针指针的函数和变量)
- 分离思想 分离思想就是说在驱动中将操作方法和数据分开 操作方法就是函数,数据就是变量 在不同的地方来存储和管理驱动的操作方法和变量,这样的优势就是驱动便于移植。
- 分层思想 分层思想是指一个整个的驱动分为好多个层次 简单理解就是驱动分为很多个源文件,放在很多个文件夹中
1.2、什么是驱动
- 设备和用户之间的桥梁,内核结构由用户级,内核级,硬件级
- 驱动,操作硬件部分代码
1.3、驱动分为3种,及区别
- 字符设备,以字节为单位读写串口,led等
- 块设备,以块为单位读写,sd卡等
- 网络设备,网卡,socket等
1.4、模块化
- 宏内核:操作系统是整体,紧耦合,直接调用函数,简单高效 微内核:相当于是多个进程,一个错误不会影响其他,Windows
- 静态模块化:程序编译内核,编译时可裁剪,加模块要重新编译烧录 动态模块化:加模块,不需要重新编译
1.5、安全性
- 驱动程序崩溃,内核可能崩溃
- 驱动效率影响内核效率
- 安全,漏洞 未初始化,例如函数指针 恶意用户程序,利用驱动的漏洞,例如传参 缓冲区溢出,例如超出缓存区大小 竞争状态,自旋锁等
1.6、应用驱动硬件的流程
APP-》C library调用open产生软中断系统调用,中断号0x80-》汇编sys_call-》VFS的sys_open-》内核空间,设备驱动的open-》硬件
1.7、设备文件
-
各种设备以文件的形式存放在 /dev目录,称设备文件。
-
主设备号,次设备号
- 主设备号:不同的设备(硬盘,led)
- 次设备号:同一类的多个设备(led1,led2)
1.8、驱动链表,数组
- 管理所有设备的驱动
- 添加(驱动插入链表顺序由设备号检索) 编写驱动,加载到内核 设备名,设备号,设备驱动函数:操作寄存器来驱动I/O
- 查找 调用 调用驱动程序,用户应用去open
1.9、udev机制
- udev是一个设备管理工具,udev以守护进程的形式运行
- 通过侦听内核发出来的uevent来管理/dev目录下的设备文件。
- udev在用户空间运行,而不在内核空间运行。
- 它能够根据系统中的硬件设备的状态动态更新设备文件,包括设备文件的创建,删除等。
- udev会根据/etc/udev/udev.conf文件中的udev_rules指定的目录,逐个检查该目录下的文件,这个目录下的文件都是针对某类或某个设备应该施行什么措施的规则文件。
1.10、地址概念
-
总线地址
- 属于一种电脑总线一部分,是由CPU 或有DMA 能力的单元,用来沟通这些单元想要存取(读取/写入)电脑内存元件/地方的实体位址。
- CPU能够访问内存的范围 例如:32位window系统,2的32次方,最大只能识别4G(即便是有8G内存条,也只能识别4G,其实识别不了4G,有用作其他的内存)
-
物理地址
- 硬件实际地址或者绝对地址
-
虚拟地址
- 逻辑地址(基于算法的地址,软件层面的地址)称为虚拟地址
- 程序在磁盘超过1G,就用到虚拟地址,一点一点的拿来运行(没有虚拟地址就无法运行,例如51,32)
- 物理地址通过页表ARM MMU映射成虚拟地址
1.11、设备驱动,设备驱动模型,驱动子系统
-
最基本的字符设备的驱动
- [字符设备驱动] ==> 自己实现 file_operations, device_create,cdev_add...
-
驱动子系统
- input 驱动来说,input 驱动子系统帮忙实现了 file_operations,申请设备号,创建设备,cdev_add 等操作
- 而 input 驱动只需实现去接收输入,然后向上层报告输入事件和输入的数据即可
-
设备模型
- 驱动和设备的外衣
- 设备硬件参数和驱动分离
- 热拔插,检测到有设备,创建驱动文件