由于对blktrace的好奇,来到了block层.通过阅读block层的代码,自己的几个错误认知被纠正,比如
一) 同步操作时,进程是在驱动中睡觉真实情况是:进程在文件系统睡觉
二) 对同一个数据块的读写是在block控制
真实情况是:对同一数据块的是在文件系统中控制.
两个周来,对文件系统肃然起敬,文件系统是一个你要花至少一年,才只能读懂其50%的模块,甚至,要想领悟文件系统的精髓,你要读page-cache,要读block层,甚至要理解存储芯片的读/写/擦除特性,真是a long long journey!
前面对page-cache做了一个大致的分析,基本能够理清其中的脉络,已经达到了效果,所以想往下走,看看block层,block层最重要的是IO调度器,看下IO调度器是怎么回事.
下面几篇文章就分析deadline-ioscheduler.
31 struct bvec_iter {
32 sector_t bi_sector; /* device address in 512 byte sectors */ 下发到设备的首地址
34 unsigned int bi_size; /* residual I/O count */ 下发的数量
36 unsigned int bi_idx; /* current index into bvl_vec */
38 unsigned int bi_bvec_done; /* number of bytes completed in current bvec */
40 };
bio相关函数积累:
bio_end_sector(bio)
bio_data_dir(bio)
bool blk_rq_merge_ok(struct request *rq, struct bio *bio)
blk_rq_merge_ok 对bio是否能合入rq做了最严格的过滤,
从block层取出一个request之后, 就开始
323 q->request_fn_active++;
324 q->request_fn(q); /* scsi_request_fn */ 这里的request_fn中调用的是scsi_request_fn!
325 q->request_fn_active--;