我们在写块设备驱动程序的时候,注册并初始化一个gendisk后,要调用add_gendisk()注册到内核,供内核使用.
后面看到打开一个块设备的时候,我们看到 使用了标准的系统调用open(),参数中是inode,这个inode从何而来,看看add_disk到底干了啥哈.
初步猜测是 那个 块文件系统(一个伪文件系统),因为我们不会通过基本的VFS中的文件来Open一个块设备.
(伪文件系统也会集成到VFS中,至于和普通文件系统的区别,在http://blog.csdn.net/a954423389/article/details/6749293 中有解释,我们的确是通过VFS中的inode来打开的块设备)
add_disk中干了三件事情:
第一件:验证设备号
第二件:注册block_device(这个东西是块文件系统的元元素)
第三件:注册请求队列
可以看到第二件事是我们关注的,调用的是register_disk函数,我们跟进去看看:
325/* Not exported, helper to add_disk(). */ 326void register_disk(struct gendisk *disk) 327{ 328 struct block_device *bdev; 329 char *s; 330 int err; 331 332 strlcpy(disk->kobj.name,disk->disk_name,KOBJ_NAME_LEN); 333 /* ewww... some of these buggers have / in name... */ 334 s = strchr(disk->kobj.name, '/'); 335 if (s) 336 *s = '!'; 337 if ((err = kobject_add(&disk->kobj))) 338 return; 339 disk_sysfs_symlinks(disk); 340 341 /* No minors to use for partitions */ 342 if (disk->minors == 1) {//次设备号数目为1,也就是没有分区 343 if (disk->devfs_name[0] != '\0') 344 devfs_add_disk(disk); 345 return; 346 } 347 348 /* always add handle for the whole disk */ 349 devfs_add_partitioned(disk); 350 351 /* No such device (e.g., media were just removed) */ 352 if (!get_capacity(disk)) 353 return; 354 355 bdev = bdget_disk(disk, 0);//返回第i个分区的block_device,如果i为0则返回代表整个设备的block_device (他调用bdget()) 356 if (!bdev) 357 return; 358 359 bdev->bd_invalidated = 1; 360 if (blkdev_get(bdev, FMODE_READ, 0) < 0) 361 return; 362 blkdev_put(bdev); 363}
看到果然和那个文件系统有关系, 这里申请来一个block_device结构体 变量,bdev.
通过open函数来分析,猜测应该是 利用block_device在VFS中创建节点inode,block_device本身没有inode,他就是把自己串成一个链表,他通过在VFS内创建inode到达管理的目的.
这里要注意的一点是,block_device只有在打开一个分区或者设备的时候才会创建.
文件系统的挂载是一码事,向已挂载的文件系统内添加文件节点inode是另一码事....
我们现在add_disk中应该就是 分配一个block_device,然后添加到VFS中的inode节点,让我们可以打开他,至于怎么打开,再看看.
看到下面这一段
341 /* No minors to use for partitions */ 342 if (disk->minors == 1) {//次设备号数目为1,也就是没有分区 343 if (disk->devfs_name[0] != '\0') 344 devfs_add_disk(disk); 345 return; 346 } 347 348 /* always add handle for the whole disk */ 349 devfs_add_partitioned(disk);
这个地方的add_disk貌似只是添加到devfs这个文件系统中,而不是 bdev中,到底是什么呢,那么我们打开设备的时候,到底是通过什么方式打开的,/dev下的 /dev/sda /dev/sdai???
那么什么时候向bdev伪文件系统添加了文件节点inode呢.