关于块设备的碎碎念

本文探讨了块设备的工作原理,包括块设备的用途、如何通过设备文件结点操作块设备、gendisk与queue的关系、驱动策略函数的作用及块设备在内核中的生命周期管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

曾经看过一段时间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在这里终于露脸了?


11。于是通过设备文件结点可以得到block_device,再可以得到gendisk,再可以得到queue,再可以得到设备的策略函数。


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。电梯对象?



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值