一,请求处理
块设备的处理函数里没有read write等函数,所有对块设备的请求如读取 写入等都是通过request函数处理的。request函数的原型是void request(request_queue_t *queue);
request函数的处理是异步的。每一个设备都有一个请求队列,当请求队列生成的时候,request函数就与该请求队列绑定在一起了,request函数总是与一个自旋锁一起使用,当request函数拥有自旋锁的时候,该锁防止内核为设备安排其它请求。构request代表了挂起的I/O请求,每个请求用一个结构request实例描述,存放在请求队列链表中
- <pre name="code" class="cpp">struct request {
- 02.
- 04. struct list_head queuelist;
- 05. struct list_head donelist;
- 06. struct request_queue *q;
- 07. unsigned int cmd_flags;
- 08. enum rq_cmd_type_bits cmd_type;
- 09.
- 12. sector_t sector;
- 13. sector_t hard_sector;
- 14. unsigned long nr_sectors;
- 15. unsigned long hard_nr_sectors;
- 16.
- 17. unsigned int current_nr_sectors;
- 18.
- 19. unsigned int hard_cur_sectors;
- 20. struct bio *bio;
- 23.
- 25. union {
- 26. struct rb_node rb_node;
- 27. void *completion_data;
- 28. };
二,请求队列
每个块设备都有一个请求队列,每个请求队列单独执行I/O调度,请求队列是由请求结构实例链接成的双向链表,链表以及整个队列的信息用结构request_queue描述,称为请求队列对象结构或请求队列结构。它存放了关于挂起请求的信息以及管理请求队列(如:电梯算法)所需要的信息。结构成员request_fn是来自设备驱动程序的请求处理函数。
三,Bio结构
通常1个bio对应1个I/O请求,IO调度算法可将连续的bio合并成1个请求。所以,1个请求可以包含多个bio。bio为通用层的主要数据结构,既描述了磁盘的位置,又描述了内存的位置,是上层内核vfs与下层驱动的连接纽带
- struct bio {
- 02.sector_t bi_sector;
- 03.struct bio *bi_next;
- 04.struct block_device *bi_bdev;
- 05.unsigned long bi_flags
- 06.unsigned long bi_rw;
- 07.unsigned short bi_vcnt;
- 08.unsigned short bi_idx;
- 09.unsigned short bi_phys_segments;
- 10.unsigned short bi_hw_segments;
- 11.unsigned int bi_size;
- 12.unsigned int bi_hw_front_size;
- 13.unsigned int bi_hw_back_size;
- 14.unsigned int bi_max_vecs;
- 15.struct bio_vec *bi_io_vec;
- 16.bio_end_io_t *bi_end_io;
- 17.atomic_t bi_cnt;
- 18.void *bi_private;
- 19.bio_destructor_t *bi_destructor;
- 20.};
- 内存数据段结构bio_vec
- struct bio_vec {
- struct page *bv_page;
- unsigned short bv_len;
- unsigned short bv_offset;
- };
四:
Linux中的队列请求处理函数为kernel/drivers/mmc/card/Block.c文件的mmc_blk_issue_rq()函数
[linux驱动]linux块设备学习笔记(四)——请求处理
原文:http://www.cnblogs.com/zhiliao112/p/4237241.html