通用块层
常用数据结构: bio
磁盘描述符 gendisk
generic_make_request 是通用块层的入口点
io调度层:
请求队列:request_queue
请求描述符:request
块设备:
block_device
注册块设备 register_blkdev 预定主设备号。
块设备文件操作描述符表:
open blkdev_open
release blkdev_close
llseek block_llseek
read genric_file_read
wrtie blkdev_file_write
aio_read generic_file_aio_read
aio_write blkdev_file_aio_write
mmap generic_file_mmap
fsync block_fsync
ioctl block_ioctl
compate-ioctl compat_blkdev_ioctl
readv generic_file_readv
writev generic_file_wrtie_nolock
sendfile generic_file_sendfile
块设备驱动程序注册流程:
1. 自定义驱动程序描述符
2. 预定主设备号 register_blkdev
3. 初始化自定义设备,alloc_disk gendisk
4. 初始化gendisk
5. 初始化块设备操作表 gendisk的fops
6. 分配和初始化请求队列
7. 设置中断处理程序 request_irq (主要调用end_thatA_request_first end_that_request_last)
8. 注册磁盘 add_disk
9.
策略例程: gendisk-》rq-》request_fn
待补充
i/o 调度请求:
generic_make_request 是通用块层向 io 调度交互的主要接口函数。
bio ---通用块层
queue_request request ---io调度层
blkdev_readpage-》block_read_full_page-》submit_bh-》submit_bio-》generic_make_request
block_dev.c
static const struct address_space_operations def_blk_aops = {
.readpage = blkdev_readpage,
.writepage = blkdev_writepage,
.sync_page = block_sync_page,
.write_begin = blkdev_write_begin,
.write_end = blkdev_write_end,
.writepages = generic_writepages,
.releasepage = blkdev_releasepage,
.direct_IO = blkdev_direct_IO,
};
.readpage = blkdev_readpage,
.writepage = blkdev_writepage,
.sync_page = block_sync_page,
.write_begin = blkdev_write_begin,
.write_end = blkdev_write_end,
.writepages = generic_writepages,
.releasepage = blkdev_releasepage,
.direct_IO = blkdev_direct_IO,
};