队列链表中元素的排序方式对每个块设备驱动程序是特定的;然而,I/O调度程序提供了几种预先确定好的元素排序方式,牵涉到“I/O调度算法”的概念,后面会提到。
backing_dev_info字段是一个backing_dev_info类型的小对象,它存放了关于基本的硬件块设备的I/O数据流量的信息。例如,它保存了关于预读以及关于请求队列拥塞状态的信息。
每个块设备的待处理请求都是用一个请求描述符来表示的,请求描述符存放在如下所示的request数据结构中:
struct request {
struct list_head queuelist;
struct list_head donelist;
unsigned long flags;
sector_t sector;
unsigned long nr_sectors;
unsigned int current_nr_sectors; //当前bio的当前段中要传送的扇区数
sector_t hard_sector;
unsigned long hard_nr_sectors;
unsigned int hard_cur_sectors; //当前bio的当前段中要传送的扇区数(由通用块层更新)
struct bio *bio; //请求中第一个没有完成传送操作的bio
struct bio *biotail; //请求链表中末尾的bio
void *elevator_private; //指向I/O调度程序私有数据的指针
void *completion_data;
int rq_status;
int errors; //用于记录当前传送中发生的I/O失败次数的计数器
struct gendisk *rq_disk; //请求所引用的磁盘描述符
unsigned long start_time; //请求的起始时间(用jiffies表示)
unsigned short nr_phys_segments; //请求的物理段数
unsigned short nr_hw_segments; //请求的硬段数
unsigned short ioprio;
int tag; //与请求相关的标记(只适合支持多次数据传送的硬件设备)
int ref_count; //请求的引用计数器
request_queue_t *q; //指向包含请求的请求队列描述符的指针
struct request_list *rl; //指向request_list结构的指针
struct completion *waiting; //等待数据传送终止的Completion结构
void *special; //对硬件设备发出“特殊”命令的请求所使用的数据的指针
char *buffer; //指向当前数据传送的内存缓冲区的指针(如果缓冲区是高端内存区,则为NULL)
unsigned int cmd_len; //cmd字段中命令的长度
unsigned char cmd[BLK_MAX_CDB];//由请求队列的prep_rq_fn方法准备好的预先内置命令所在的缓冲区后面还会详细谈到
unsigned int data_len; //通常,由data字段指向的缓冲区中数据的长度
unsigned int sense_len; //由sense字段指向的缓冲区的长度(如果sense是NULL,则为0)
void *data; //设备驱动程序为了跟踪所传送的数据而使用的指针
void *sense; //指向输出sense命令的缓冲区的指针
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-48358-4.html
长得好像庞麦郎啊
文官不贪财