今天来的比较晚,下班也相应要晚一些。吃完饭上来又看了一下代码,总算看清了一些关于block_device的眉目。
以前对block_device不解的是:何时分配它分配内存?曾经一阵狂追,发现了bdget这个函数。块设备的核心数据结构应该是gendisk,block_device应该只是gendisk的一个容器。那么生成一个block_device应该是在找到gendisk之后的事。bdget这个函数只有一个参数:设备号。表面上来看,这个函数很正点,add_disk的时候将设备号与gendisk关联了,bdget根据设备号找到gendisk,然后做点脏活整出个block_device。一切跟所预想的一致。
而实际上bdget根本没有鸟gendisk,如果之前为这个设备生成了bock_device,调用bdget会直接得到其缓存。如果是第一次使用块设备,bdget居然直接生成了一个block_device!没有gendisk的block_device只是一个空壳呀。
今天又从头由sys_mount开始看一了遍。sys_mount要得到挂载点的inode,然后让指定的文件系统去读取superblock。而基于块设备文件系统的get_sb方法是利用get_sb_bdev。这个函数以块设备文件名为参数调用open_bdev_excl,从而得到了block_device,然后将block_device传给文件系统相关的函数填充super_block。很好,就是open_bdev_excl完成了从块设备文件名到block_device的转换。先设想一下实现:打开这个文件,得到inode,得到设备号,向系统查询与该设备号相关的的gendisk,生成block_device,将其与gendi