bio结构中的字段
struct bio { sector_t bi_sector; //要传输的第一个扇区。 struct bio *bi_next; //链接到请求队列的下一个bio struct block_device *bi_bdev;//指向块设备描述符的指针 unsigned long bi_flags; //bio的状态标志 unsigned long bi_rw;//IO操作标志 READ/WRITE unsigned short bi_vcnt; //bio中的bio_vec数组中当前元素的个数 unsigned short bi_idx; //bio的bio_vec数组中段的当前索引值 unsigned int bi_phys_segments; //合并后bio中的物理段的数目 unsigned int bi_size; //所需传输的数据字节数 unsigned int bi_seg_front_size; unsigned int bi_seg_back_size; unsigned int bi_max_vecs; //bio的bio_vec数组中允许的最大段数 unsigned int bi_comp_cpu; /* completion CPU*/ atomic_t bi_cnt; //bio引用计数器 struct bio_vec *bi_io_vec; /* the actual vec list*/ bio_end_io_t *bi_end_io;//bio的IO操作结束时调用的方法 void *bi_private;//通用块层和块设备驱动程序的IO完成方法使用的指针 bio_destructor_t *bi_destructor; //释放bio时调用的析构方法 };
bio中的每个段是由一个bio_vec数据结构描述的,bio_vec数据结构如下
bio_vec{ struct page* bv_page //指向段在页框描述符的指针 unsigned int bv_len //段的字节长度 unsigned int bv_offset //页框中数据的偏移量 }
在通用块层启动一次新的IO操作时,会调用bio_alloc函数分配一个新的bio结构,bio是由slab分配器分配的。内核同时也为bio_vec结构分配内存池。
原文地址:http://blog.csdn.net/zhufengtianya/article/details/42145985