add_disk() (本文纠错中)

我们在写块设备驱动程序的时候,注册并初始化一个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呢.













你可能感兴趣的:(struct,360,disk)