块设备驱动程序

来源:互联网 发布:js event touch 编辑:程序博客网 时间:2024/06/11 00:43
通用块层
常用数据结构: 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,
};


0 0