sysfs與ramfs、tmpfs、devtmpfs的一點區別

ramfs在掛載以後,其內部以dentry和inode爲核心層次維護。
sysfs在掛載後,一般只會把掛載點的dentry和inode進行創建,並初始化該sys目錄的inode->i_op爲sysfs_dir_inode_operations.
這之後所有的sys下文件的讀寫訪問操作,都需要經過look_up先找到文件路徑,並逐一給每個目錄建立inode與dentry,是個動態的過程,只有這個時候纔會將sysfs_get_inode(inode層次關係到這裏有回到了由sysfs_dirent來管理,回到最初的sysfs的構造),對所屬的inode類型進行sysfs_init_inode操作,確定該文件或者目錄的inode操作接口就被初始化爲sysfs_dir_inode_operations或者sysfs_file_operations等
一旦存在dentry和inode後,會一直存在。

總的說明,sysfs先是自己一sysfs_dirent將kobject和kset維護起來,並在掛載以後只初始化化根目錄sys inode的sysfs_dir_inode_operation. 通過不同的訪問過程如讀寫操作,來逐一建立dentry和inode,統一到vfs模型後,就可以方便用戶層的讀寫操作了。
猜測原因是:理論sysfs的inode是少量的,比dev肯定要少,所以沒有進行靜態的建立inode。

而對於ramfs而言,如tmpfs就是基於ramfs建立的,一旦加載/dev/以後也是先初始化dev目錄根inode和dentry如
ramfs_dir_inode_operations。
而一旦執行mknod /dev/xxx會調用到vfs_mknod內部
 error = dir->i_op->mknod(dir, dentry, mode, dev);即爲ramfs_dir_inode_operations->mknod

ramfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)
{
     struct inode * inode = ramfs_get_inode(dir->i_sb, dir, mode, dev);//新建立一個inode節點並和設備信息綁定
     int error = -ENOSPC;

     if (inode) {
          d_instantiate(dentry, inode);
          dget(dentry);     /* Extra count - pin the dentry in core */
          error = 0;
          dir->i_mtime = dir->i_ctime = CURRENT_TIME;
     }
     return error;
}
這個過程是新建立一個設備文件節點,同時還生成了inode節點,並將設備節點相關的信息支持綁定到inode中,由init_special_inode初始化特殊設備節點到這裏就又是統一到了vfs文件系統的標準。這個過程本質是靜態的。對inode的處理的過程明顯比sysfs來的直接明瞭,一般在Android系統中全部由uevent來負責完成mknod自動創建設備節點。

另外在內核啓動時devtmpfs創建設備文件的節點過程也和tmpfs很類似。他是將會所有inode建立好以後再去mount,mount後設備文件節點將會具有所有的inode和dentry。

所依,總的來說linux內核對所有文件都進行了vfs化的操作,從而使得不同文件系統在上層的訪問接口做到一致,而內核中就是以dentry和inode來體現的。經過inode再去分發處理爲不同的文件操作類型。如sysfs設備屬性文件,tmpfs下的字符設備文件、塊設備文件等等。

發佈了162 篇原創文章 · 獲贊 145 · 訪問量 81萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章