⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 +

📁 linux内核学习笔记 希望想看的人可以很快下载到
💻
字号:
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 + -