基于linux自动创建设备节点而引入的疑问

1. 自动创建设备节点时mknod做了哪些事情?
mknod会在内部自动创建一个inode,代表设备文件节点的物理磁盘属性,该inode存在于devtmpfs或者tmpfs等ramfs文件系统中,inode会记录下建立时传入的设备文件节点char/block等类型以及相应的设备号等信息,通过父目录的ramfs_dir_inode_operations来决定,调用ramfs_mknod生成当前设备节点文件的inode,并初始化管理设备类型和设备号。一般更上层的话,dentry更多的是内核维护着,其中的d_inode即为实际的inode节点,是多对一的关系。
inode创建更多的依赖于每一级目录dentry,通过不断的lookup然后直到最好一级目录时,完成设备文件节点的inode创建以及初始化,一般使用ramfs的mknod接口完成,mknod来源于其父目录如/dev/,/dev/input/等,每级目录都是属于ramfs文件系统,调用如下
int vfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)
{
     int error = may_create(dir, dentry);

     if (error)
          return error;

     if ((S_ISCHR(mode) || S_ISBLK(mode)) &&
         !ns_capable(inode_userns(dir), CAP_MKNOD))
          return -EPERM;

     if (!dir->i_op->mknod)
          return -EPERM;

     error = devcgroup_inode_mknod(mode, dev);
     if (error)
          return error;

     error = security_inode_mknod(dir, dentry, mode, dev);
     if (error)
          return error;

     error = dir->i_op->mknod(dir, dentry, mode, dev);//创建设备文件节点,调用的是ramfs的mknod
     if (!error)
          fsnotify_create(dir, dentry);
     return error;
}

这也进一步说明了,mknod的使命是将驱动设备号跟inode关联起来的。

一旦打开对应的设备节点路径时,内核就会去查找指定路径对应的dentry,然后找到inode。进而可以确定该inode该执行的i_op,一般如char设备类型,则执行chardev_open函数。进一步则以inode为核心,以devt主设备号查找该字符设备mamp表中的字符设备,然后将节点的i_cdev指向查找到的fops,进而去确定实际file对应的fops(由内核根据次设备号去分发决定).

在存储介质中,每个文件对应唯一的inode结点,但是,每个文件又可以有多个文件名。即可以通过不同的文件名访问同一个文件。这里多个文件名对应一个文件的关系在数据结构中表示就是dentry和inode的关系。
Inode中不存储文件的名字,它只存储节点号;而dentry则保存有名字和与其对应的节点号,所以就可以通过不同的dentry访问同一个inode。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章