superblock的blocksize

块设备硬件操作数据的最小单位一般称为sector size,文件系统管理数据的最小单位则称为block size。我总有种‘曾经两者都常是512 byte’的感觉,不知何故。


在内核代码里,blocksize出现在与块设备相关的结构体里,也出现在与文件系统相关的结构体里。我一直认为,与块设备相关结构体里的blocksize就是hardware sector size。其实,光是与块设备相关结构体里就出现了两个size,一个在block_device里,一个在queue里。在queue里的那个才是hardware sector size,而block_device里的blocksize跟文件系统里的blocksize一样。


这样设计令人颇感奇怪:为什么要在block_device里设置与文件系统相关的字段?文件系统里(superblock)还会有blocksize这一字段,具体文件系统自定义的superblock通常又会有这一记录,乱套了。


仔细一想,这样也合理。这个block_device的块大小记录关系到buffer cache,也就是说一个buffer_header表示的内存单位实际上是由block_device里的blocksize决定的,继而是被文件系统里的blocksize决定的。buffer cache毕竟是给文件系统用的,表征文件系统视角的block当然有理可依。如果这个blocksize与hardware sector size不一致,估计会在block layer有转换。


令人不大舒服的地方大概是两者概念出现的先后顺序:一般看来,先有块设备,再有文件系统。前面的描述其实默认了一点:块设备的blocksize是依据文件系统来的。那么,最初只有块设备而没有文件系统的时候,块设备的block size从何谈起呢?想当然的话,可能认为默认是块设备的hardware sector。看了下代码,给block_device分配内存后将blocksize初始化为PAGESIZE,跟底层块设备结合起来时,如果发现块设备的hardware sector小于PAGESIZE,则将其提为PAGESIZE,否则直接使block size等于hardware sector。简而言之,blocksize为PAGESIZE或者较大的hardware sector size。其实几乎不会有大于PAGESIZE的hardware sector,可以认为初始时block size就为PAGESIZE?


在ext2里,挂载文件系统时,会重置block device的block size值。规则是,如果hardware sector size比1K大,则用hardware sector size,否则用1K。这个显然会覆盖之前的PAGESIZE,不知道前面处心积虑计算初始block size值为了什么。


就这样block deivce的block size值被文件系统所决定。此结果更深远的影响是buffer cache也以文件系统的block概念描述内存。“文件系统不使用分区的第一个block”之block指的也是文件系统意义上的block。这个描述似乎并不准确。如果hardware sector是4K,block size也为4K,照理说superblock应该位于分区第一个4K之后,其实它在第一个1K之后。“第一个block”之block应该指的默认1K 大小时的block。干脆说ext2从来不用分区开头的1K。不过考虑到大部分时候hardware sector size都小于1K,block size一般也就为1K,这个说法大部分时候还是成立的。如果做文件系统的时候选定了非默认1K block size,不知情况会如何。以后再看吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值