📄 +
字号:
any question,send email to netxiong@263.net
####已经改变########
相关文件:
/linux/blk.h
/linux/blkdev.h
/fs/block_dev.c
/drivers/block/ll_rw_blk.
定义的MAJOR_NR是为了检索
******************************块设备结构图*****************************
blk_dev定义在ll_rw_blk.c中
blk_dev[0]
blk_dev[1]
bli_dev[…]
request_queue---->struct request_queue
queue(处理函数) rquest_fn_proc
data(参数) ……
make_request_fn
***********************************************************************
**************************块设备的处理顺序******************************
block_read
ll_rw_block
submit_bh
generic_make_request
q->make_request_fn()<--->__make_request()
add_request()
其中,在q->make_request_fn这一步中,发生了变化,如果用户自己不设置自己的处理函数,
那么系统默认为__make_request,在这个函数中,使用add_request吧请求加入到请求队列中,
然后进行处理,如果设备不需要请求队列,则可以设置自己的make_request_fn,
直接在这个函数里面进行处理就行了。
************************************************************************
************************注意的问题**************************************
对于块设备来说,其major设备号只是表明一种设备的种类。对于可分区的设备来说,
minor设备号可以提供更多的信息,例如一个可分区设备,major设备号是235,表示一种设备,
minor设备号的高四位可以表示确切的设备,低四位可以表示那个分区。
例如,ide硬盘的major号是33,那么高四位如果是3,则代表是第三块硬盘,低四位为2,则代表第二个分区。
************************************************************************
***************************关于add_request以后的一些操作的详细说明****************
相关文件
/include/linux/blkdev.h
真正的数据是怎样送到下层的驱动程序,这一点还是比较复杂的一个过程,首先介绍一个数据结构
tq_disk,这是一个bottom_half类型的结构,也就是说,系统会隔一段时间就访问这个结构,其实
他仅仅就是一个队列而已,这个队列上挂着各种各样底层块设备所需要的请求队列,也就是说,系统
中所有的对块设备的请求都要连接到这个队列上,系统隔一定时间就扫描这个队列,从队列中取出
各种request,按照request上的要求调用相应的块设备的驱动程序进行执行。或者某些驱动程序可以
调用run_task_queue(&tq_disk)来强迫进行读写。
了解了tq_disk这个结构以后,我们看看系统怎样利用这个结构进行读写的。对于没一种块设备驱动
程序来说,它都有一个struct request_queue结构来代表它所在的设备的请求队列,也就是说,所有
对这个设备产生的request都会被加入到这个链中来,这个机构中有一个函数指针(plug_device_fn)
他所指向的函数一般来说是generic_plug_device,
这个函数是在blk_init_queue中被赋值的,而blk_init_queue是所有驱动程序一般都要调用的。
而正是这个generic_plug_device将我们的request_queue中的一个属性plug_tq连接到了tq_disk队列上
所以以后的所有的加入到request_queue中的request都相当于加入到了tq_disk中了,
而generic_plug_device是在__make_request中调用的,也就是说,在__make_request中,系统将这个
设备的请求队列加入到了tq_disk结构中了。
这个时候,当add_reqeust把一个request假如到了request_queue中去以后就返回了,这个时候系统并没有
实际完成读写操作,所以明显是一个sync过程
**********************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -