【Tiny6410 And Linux】—(5.2)—RamDisk 驱动实现(自己绑定 make_request_fn() )——原理

来源:互联网 发布:linux编译动态链接库 编辑:程序博客网 时间:2024/05/22 15:09

电脑总是 TMD 坏!很让人烦气!
块设备实验做完了,那个令人纠结的错误竟然是自己没有在意 x86 平台和 ARM 平台的驱动,所以 Makefile 是直接 cp 以前 ARM 平台的驱动来的,一堆错误!
让人蛋疼拘谨!查啊查,后来找到国嵌源码,一看 Makefile,擦!顿时石化!


好了,上一篇文章是关于内核的一个 IO 调度器,对于 ramdisk、U 盘、记忆棒之类的设备,并不存在磁盘所面临的寻道时间问题,因此对这样的“块设备”而言,一个 IO 调度器不但发挥不了作用,反而其本身将白白耗掉不少内存和 CPU。

补充:
使用 blk_init_queue() 函数来初始化一个请求队列,默认会将请求队列的 make_request_fn 方法设置为内核缺省的处理函数 __make_request()。该函数会使用 IO 调度器将多个 bio 的访问顺序进行优化,整合,合并为一个请求放入请求队列。

对于上面的问题,今天主要是需要实现自己的 make_request_fn 函数,通过函数 blk_alloc_queue() 我们可以分配一个请求队列结构而不将 make_request_fn 方法设置为默认的处理函数 __make_request()。

主要过程:
①、 分配一个请求队列
blk_alloc_queue();
②、 为请求队列绑定 make_request_fn 方法
blk_queue_make_request();

上一篇文章是调用内核缺省函数 __make_request()(当然,由于电脑还没有修回来,所以代码暂时还没贴出来,期待电脑不要有太大问题!),由于 ramdisk 不需要这个 IO 调度器,所以这一篇文章就是要自己写 IO 调度机制。

在上一篇文章的基础上,填充成员 request_queue 结构!

struct request_queue{request_fn_proc *request_fn;make_request_fn *make_requset_fn;…};

request_fn 指向用于处理对块设备数据请求的函数,make_request_fn 则指向用于构造这种请求的函数,make_request_fn 是类型重定义,它的原型如下:

typedef int (make_request_fn) (struct request_queue *q,struct bio *bio);

该函数方法的第二个参数 bio 是块设备驱动中用来描述一次块设备 IO 请求的结构。 make_request_fn 方法的作用通常是根据传入的 bio,并通过相应的 IO 调度器将多个 bio 的访问顺序进行优化,调整,合并为一个请求放入请求队列。
当然,由 make_request_fn 方法构造的请求队列接着会被 request_fn 制定的函数处理。下面是关于 bio 结构的描述:

struct bio{sector_t bi_sector; /* 要访问的第 i 个扇区 */unsigned int bi_size; /* 以字节为单位,所需传输的数据大小 */struct bio_vec *bi_io_vec; /* 实际的 vec 列表 */…};


下面是 bio_vec 结构描述:

struct bio_vec{struct page *bv_page; /* 页指针 */unsigned int bv_len; /* 传输的数据长度 */unsigned int bv_offset; /* 偏移量 */};

 

下面应该是写具体的函数了,由于没有源码,所以也就不写了(呵呵,给我源码我也看不明白!!!)

唉,以后碰到问题,这回真心得自己解决了!!!

原创粉丝点击