基於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。

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