块设备驱动

来源:互联网 发布:python 安卓 编辑:程序博客网 时间:2024/05/19 16:03

        块设备是以数据块为访问单位访问数据的设备,一般每个块的大小为512字节的倍数(一个扇区的大小也是512字节),可以随机访问数据。对应的字符设备是以1个字节为访问最小单位的,只能顺序访问数据!

Mapping Layer: 计算出文件文件在磁盘上的实际位置,将对文件的访问转换成对磁盘扇区的访问。

Generic Block Layer:Linux内核为块设备抽象了统一的模型,把块设备看作是由若干扇区组成的数据空间。上层的读写请求在通用块层被构造成一个或多个bio结构。

I/O Scheduler Layer:将I/O的操作请求进行排序和选择优化。

        块设备驱动的开发分为有I/O调度器的和无I/O调度器的,无I/O调度器的方法适用于Ramdisk,U盘,记忆棒之类的设备,并不存在磁盘所面临的寻道时间的问题。因此使用I/O调度器反而会增加CPU的开销。

有I/O调度器算法的访问流程:

        blk_init_queue(...) ---->blk_init_quue_node(...)-----> blk_queue_make_request(q,__make_request)----> __make_request(...) ----> (* make_request_fn)(struct request_queue * q)

无I/O调度器算法的访问流程:

        blk_alloc_queue(...) ---->blk_queue_make_request(...) ----> (*make_request_fn)(struct request_queue * q,struct bio *bio)

        一个struct bio代表一次块设备I/O请求。无I/O调度器的思想即完全使用自己实现的make_request_fn,来一次bio处理一次。而有I/O调度器的则会先使用内核中__make_request(...)后再调用make_reuest_fn,作用就是实现bio的优化,将多个连续的bio合并成一个请求。