【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; /* 偏移量 */};
下面应该是写具体的函数了,由于没有源码,所以也就不写了(呵呵,给我源码我也看不明白!!!)
唉,以后碰到问题,这回真心得自己解决了!!!
- 【Tiny6410 And Linux】—(5.2)—RamDisk 驱动实现(自己绑定 make_request_fn() )——原理
- 【Tiny6410 And Linux】—(5.2)—RamDisk 驱动实现(自己绑定 make_request_fn() )——代码
- 【Tiny6410 And Linux】—(5.1)—RamDisk 驱动实现(内核缺省的处理函数 __make_request())——原理
- 【Tiny6410 And Linux】—(5.1)—RamDisk 驱动实现(内核缺省的处理函数 __make_request())——代码
- 【Tiny6410 And Linux】—(2.4)—实现 input 模型按键驱动——原理
- 【Tiny6410 And Linux】—(2.1)—platform 总线、设备、驱动——原理
- 【Tiny6410 And Linux】—(6.1)—LCD 驱动测试程序——原理
- 【Tiny6410 And Linux】—(2.4)—实现 input 模型按键驱动——代码
- 【Tiny6410 And Linux】—(6.2)—LCD 驱动测试程序(BMP 显示位图)——原理
- 【Tiny6410 And Linux】—(2.1)—platform 总线、设备、驱动——代码
- 【Tiny6410 And Linux】—(6.1)—LCD 驱动测试程序——代码
- 【Tiny6410 And Linux】—(2.2)—Linux 中断处理——原理
- 【Tiny6410 And Linux】—(1.1)—kobject——原理
- 【Tiny6410 And Linux】—(1.2)—kset——原理
- 【Tiny6410 And Linux】—(1.3)—bus 设备模型——原理
- 【Tiny6410 And Linux】—(1.4)—device 设备模型——原理
- 【Tiny6410 And Linux】—(1.5)—driver 设备模型——原理
- 【Tiny6410 And Linux】—(2.3)—使用工作队列处理按键中断——原理
- 注意编码 java 读取properties
- 倡导大家一定要热爱seo,而不是每天去抱怨
- oracle 误删且已经提交的数据的恢复。
- 七日掌握版面设计基础:一,选择样式
- vc自定义消息的发送与接收的方法实现
- 【Tiny6410 And Linux】—(5.2)—RamDisk 驱动实现(自己绑定 make_request_fn() )——原理
- 基于.net的可扩展框架设计 - 主体思路
- 2012-5-23 知识总结
- json的pom配置
- JAVA WEB环境准备!
- About Last Night:点亮你的夜生活
- log4j、 slf4j 、logback
- 无价值的机械创新
- 我奋斗了18年不是为了和你一起喝咖啡