曾经看过一段时间block层,没看明白。最近比较闲,打算再看一次。看之前,先凭着以前的印象胡言乱语几句。
1。块设备主要供内核内部使用,其暴露的设备文件结点只供用户引用;但可模拟出字符设备供用户直接操作。
2。块设备文件结点之设备类型为block,当dd作用于它时发生了什么?
3。一个块设备文件结点对应内核内部gendisk数据结构,那么文件结点的建立应该在注册这些gendisk之时,即add_disk里。
4。块设备驱动中最主要的入口点是所谓策略函数。
5。有一个数据结构名为lock_device,名字很正点,但如果块设备核心数据结构为gendisk,这货做甚用?
6。块设备暴露给用户的名字仅供用户引用,最一般引用是mount时。
8。按时内核惯用面向对象编程风格,gendisk(对象)里应该有对应操作自身方法,即策略函数。但实际上,策略函数跟queue结构体联系在一起了,queue才是对象,queue才代表一个设备实例?
9。如果策略函数第一个参数是queue,那么queue作为对象需要有自己的身份。策略函数要能区别个体。两个同型号的块设备可以共用驱动(方法),但驱动需知道其中的区别,比如所占IO商品或memory-mapped寄存器的地址。queue中应该有字段让对象有身份(identity)。哪怕是不同的编号(设备号不就可以?)。
10。queue结构体才跟gendisk连在一起。gendisk和block_device相关系。block_device在这里终于露脸了?
12。这些结构体似乎都应该动态分配,什么时候分配的呢?
13。gendisk是写驱动的人分配分区空间的,queue也应该在此时分配并初始化,初始时将驱动提供的策略函数与之关联。
14。调用add_disk后,其它就交由内核的block层来管了。
15。那block_device是什么时候分配的?mount又是怎样通过文件名来找到block_device的?
16 注册gendisk的时候将block_device与设备号相关联了,就像字符设备那样。这时就有block_device了?
17。mount里会对块设备文件结点进行open吗?还是直接利用设备文件的名字或者说主次设备号来找到block_device?
18 早期实现中,找到设备实例后,直接调用其策略函数,将某个sector读入内存之中(真是简单明了)。现在的Linux里对块设备操作的入口点在哪呢?
19。找到block_device找到gendisk找到queue,再调用queue的什么方法。中间涉及到电梯层,将請求交给电梯,而不是交给块设备。
20。以前,对策略函数调用就开始操作硬件了(?),现在只是向电梯层提交請求,由电梯层来优化請求队列,并决定何时调用驱动函数操作硬件进行传输。调用者并不管后续的流程。并不直接与块设备驱动的策略函数交互,而是与电梯层交互,电梯层再与策略函数交互。
21。电梯对象?