7.块设备驱动

一、正确理解块设备驱动的概念

1、块设备和字符设备的差异

块和字符是两种不同的访问设备的策略

同一个设备可以同时支持块和字符两种访问策略;

设备本身的物理特性决定了哪一种访问策略更适合;

块设备本身驱动层支持缓冲区,而字符设备驱动层没有缓冲;

块设备驱动最适合存储设备。

 

2、块设备驱动的特点

字符设备只能顺序访问(如串口发送数据顺序),而块设备可以随机访问(不连续块访问);

传统的机械式块设备(如硬盘、DVD)可以随机访问,但是连续访问效率更高,因此块设备驱动中有排序逻辑将用户的随机访问重新调整成尽量连续访问以提升效率;

电磁设备Nand、SD卡等随机访问效率等同于顺序访问;

块设备驱动和字符设备驱动不同,应用层对块设备驱动的访问一般不是直接操作设备文件(/dev/block/xxx,或者/dev/sdax),而是通过文件系统来简洁操作。(思考裸机阶段时刷机烧录SD卡时说过的对SD卡的2种访问:文件系统下访问和扇区级访问)

 

3、块设备相关的几个单位

(1)扇区(Sector)

概念来自于早期磁盘,在硬盘、DVD中还有用,在Nand/SD中已经没意义了。

扇区是块设备本身的特性,大小一般为512的整数倍,因为历史原因很多时候都向前兼容定义为512。

(2)块(block)

概念来自于文件系统,是内核对文件系统数据处理的基本单位,大小为若干个扇区,常见有512B、1KB、4KB等

(3)段(Section)

概念来自于内核,是内核的内存管理中一个页或者部分页,由若干个连续为块组成。

(4)页(Page)

 

概念来自于内核,是内核内存映射管理的基本单位。linux内核的页式内存映射名称来源于此。

(5)总结:块设备驱动对下以Sector为单位管理块设备,对上以Block为单位和文件系统交互。

二、块设备驱动框架简介

1、块设备驱动框图

 

7.块设备驱动_第1张图片

(1)VFS

 

虚拟文件系统,是文件系统的抽象,对上可以接各种文件系统,是一对多的关系,是分层理论。

(2)通用块层

对所有块设备都适用,屏蔽了不同硬件的差异。类似于字符设备驱动框架的第一部分。

(3)IO调度层(电梯算法)

有别于其他设备的地方。这里提供了合并、排序等机制。

读写相当于电梯上、下的操作。

(4)块设备驱动层(真正硬件操作部分)

2、重点结构体

(1)struct request,对设备的每一次操作(譬如读或者写一个扇区)

(2)struct request_queuerequest,队列

(3)struct bio,通用块层用bio来管理一个请求

(4)struct gendisk,表示一个磁盘设备或一个分区

 

首先,由于块设备例如:硬盘,Flash的物理特性,大多以扇区,块为单位,要是想字符设备一样直接提供read,write函数,驱动执行很慢7.块设备驱动_第2张图片

所以要优化下

7.块设备驱动_第3张图片

 

你可能感兴趣的:(linux驱动)