本系列是对 陈莉君 老师 Linux 内核分析与应用[1] 的学习与记录。讲的非常之好,推荐观看
留此记录,蜻蜓点水,可作抛砖引玉
![alt](https://i-blog.csdnimg.cn/blog_migrate/ba105ba6119e077c2e24aff88f4affc1.png)
9.1 设备驱动概述
因为UNIX/Linux一切皆文件,所以也将设备
纳入文件管理体系下
![alt](https://i-blog.csdnimg.cn/blog_migrate/66404b061cf0faf31427104ea42f9b46.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/0d7eb366d42a87591efa2a8182e7e8fb.png)
Linux将设备分为三大类,一类是像磁盘那样,以块或扇区为单位,成块进行输入输出的设备,称为块设备
;
另一类像键盘那样,以字符为单位,进行输入/输出,称为字符设备
;
还有一类,是网络设备
,与前两者有很大不同 ----
块设备和字符设备对应/dev下的一个设备文件,而网络设备不存在这样的设备文件,采用套接字socket来访问.
![alt](https://i-blog.csdnimg.cn/blog_migrate/e421f3ed1034b84d717f2aae4eb1adca.png)
文件系统通常都建立在块设备上,也有部分放在内存,如proc文件系统,则不需要驱动程序.
建立设备文件的两种方式:
![alt](https://i-blog.csdnimg.cn/blog_migrate/e53a04d9ccc8de342b190f51111d30c0.png)
Linux内核分为五大部分:
-
进程管理 -
内存管理 -
文件系统管理 -
设备管理 -
网络管理
每一部分都有承上启下的作用.
![alt](https://i-blog.csdnimg.cn/blog_migrate/8025f1c6ed4a0c36323e1b7989861040.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/e294ba0634f370faf6cafbcdf89c4c13.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/1f71d52d98877eda8b3cfbfdfaffba53.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/2d6592d5f7203ac6089018ea940ca2bc.png)
思考:
应用程序以什么形式访问各种硬件设备?为什么采用这种方式?
9.2 IO空间的管理
设备控制器:
![alt](https://i-blog.csdnimg.cn/blog_migrate/456acafba48e8f4bfc33ce08011babb3.png)
I/O内存和I/O端口
![alt](https://i-blog.csdnimg.cn/blog_migrate/2c268c18a05541e5b8d5008fe3967c9f.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/ec17441d29c893228750cca163292452.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/12fb7be15edceb247c47e8290c10105a.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/e2b2769f7fb4753e74fd63c519a17330.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/f2345903e184498b9291c2e575ffc5f0.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/cc97be0df2ba0d2cc02ea16db311ce26.png)
思考:
内核对I/O资源的管理为什么采用树结构?
9.3 设备驱动模型
Linux支持世界上几乎所有不同功能的硬件设备,导致Linux内核中有一半的代码是设备驱动,且随着硬件的快速升级迭代,设备驱动的代码量也快速增长..为了降低设备多样性带来的Linux驱动开发的复杂度,以及设备热插拔处理,电源管理等,Linux提出了设备模型(Driver Model)
(2.x只有200多M,现在5.x版接近3G)
![alt](https://i-blog.csdnimg.cn/blog_migrate/f551c2a4ff893fb8f964c008f6ca3d7b.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/e27066982b8e1abc1610dc96287c38e3.png)
Sys文件系统,是一个类似proc文件系统的特殊的文件系统
![alt](https://i-blog.csdnimg.cn/blog_migrate/9ed8942a4766cf4e8cf9709056737d14.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/a5a869eb3c29da260ba5472ba9667edd.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/2fb7a8a408f595f5a3cc058b0bd44d57.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/9ce09164e0b5fffff9882a3d9b7ddb8c.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/3548323dc737e73a76953c78138fe90f.png)
地位相当于面向对象中的总基类
![alt](https://i-blog.csdnimg.cn/blog_migrate/0b97300a01afac51725ea9b8958a94b9.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/ac974ed5ef0f0d0fc5eb42be55a52f33.png)
机制与策略分离:
![alt](https://i-blog.csdnimg.cn/blog_migrate/d161e76798d62f5dd6a655a0be5b8720.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/f5d5969f6659a291edf4f58e79d1202f.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/7b909029f18cb1f627ddbc32269b6816.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/3dc85e480a5238f140a76b464465f322.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/61c8ac68619eb660544e6418ef4bfe10.png)
设备与驱动 匹配的过程
设备和驱动是男女方,红娘相当于总线, 进行撮合
![alt](https://i-blog.csdnimg.cn/blog_migrate/704df2dcb818ee7159fb50eb64121058.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/5eae8ae38e6c06e807d75d30b36827d0.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/d7373a1e56f5aca90e814837aecc4184.png)
思考:
platform平台模型的优势是什么?
9.4 字符设备驱动程序简介
只能一个字节一个字节进行读写操作的设备,不能随机读取设备中的某个设备,必须按照先后次序来进行, 字符设备是面向流的设备.常见的字符设备有鼠标,键盘等
![alt](https://i-blog.csdnimg.cn/blog_migrate/fffb82793b5995b341d21e850ae0d374.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/843a2159e1445b02837b8b79cadb1119.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/4bc7ef2839c70d12376e7e0adde1bc78.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/9e9f65d58ab52973979e069543c2c058.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/7508726311a0a318e509f1b0656cc43c.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/741567951defa939e6898c75eef486ad.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/7a7f4192fa2290253e1fa8e816e227df.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/e774395e6e44ebc38bac21615a2d1434.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/a16d629676c3d5c6982a313bd269cd1e.png)
Linux字符设备驱动[2]
思考:
从原理上说明file_operations操作方法集,为什么说它是定义了字符设备提供给VFS的接口函数?
9.5 块设备驱动程序简介
字符设备与块设备的区别:
I/O调度:
希望磁头总能往一个方向移动,到底了再向另一个方向移动. 电梯调度算法
![alt](https://i-blog.csdnimg.cn/blog_migrate/cbd14c1069e82379e04b0e7999d58615.png)
第三种调度算法常用于数据库.第四种是内核默认的调度算法.
![alt](https://i-blog.csdnimg.cn/blog_migrate/6df47219c7dfc9af514423ea1470cadc.png)
块和扇区的关系:
![alt](https://i-blog.csdnimg.cn/blog_migrate/b4d13c09bed80718dd9938706df369fb.png)
![alt](https://i-blog.csdnimg.cn/blog_migrate/3e1531aaaa2113f3f0b4f0f1f067adb4.png)
扇区是磁盘读写的基本单位,是磁盘上最小的操作单位,是文件系统和块设备之间传送数据的单位.
一般一个扇区的大小是512字节,但如果是SSD,则为4096个字节.
当一个扇区的大小超过512字节时,需要将多个内核扇区对应一个设备扇区.
![alt](https://i-blog.csdnimg.cn/blog_migrate/7f11c9fc8be55d20dd058caee682476d.png)
Linux块设备IO子系统(一) _驱动模型[3]
linux内核之块设备驱动图解[4]
思考:
从虚拟文件系统到硬件,为什么要对块设备进行分层管理?
参考资料
Linux 内核分析与应用: https://next.xuetangx.com/course/XIYOU08091001441/1516763
[2]Linux字符设备驱动: https://www.cnblogs.com/chen-farsight/p/6155518.html
[3]Linux块设备IO子系统(一) _驱动模型: https://www.cnblogs.com/xiaojiang1025/p/6500557.html
[4]linux内核之块设备驱动图解: https://my.oschina.net/fileoptions/blog/951759
本文由 mdnice 多平台发布