sysfs系統 檔案和目錄的建立

2021-08-08 19:18:45 字數 3606 閱讀 3687

sysfs是linux的特殊檔案系統,這個檔案系統主要作用是在使用者態展示裝置的資訊。

linux計算機系統中,可以在根目錄下面找到sys目錄,這個目錄就是利用sysfs檔案系統進行建立的。

開啟sys目錄,可以看到裝置的分類顯示,如下所示:

yxf@yxf-pc:sys$ ls

block  bus  class  dev  devices  firmware  fs  hypervisor  kernel  module  power

作業系統把裝置分為block、bus、class、dev、devices、firmware、fs等目錄。

linux系統通過proc檔案系統來管理核心的重要資料,但隨著sysfs檔案系統越來越重要,有些核心資料也通過sysfs檔案系統來提供;proc因為本身的缺陷,越來越少被用到。

備註:sys目錄下不能建立和刪除檔案,因為sysfs檔案系統沒有提供建立和刪除檔案 功能。  和裝置有關的另乙個目錄時dev目錄,根目錄下面的/dev目錄裝置檔案只是代表乙個符號,不包括裝置相關資訊。

4.1 檔案和目錄的建立

4.1.1 sysfs 檔案系統的初始化

sysfs檔案系統提供了乙個初始化函式sysfs_init來完成註冊和初始化工作,**如下:

int __init  sysfs_init(void)

int  error = -enomem;

sysfs_dir_cachep = kmem

int __init sysfs_init(void)

} else

goto out_err;

out:

return err;

out_err:

kmem_cache_destroy(sysfs_dir_cachep);

sysfs_dir_cachep = null;

goto out;

}

register_filesystem 和 kern_mount 分析過,把sysfs檔案系統插入到檔案系統的總煉表中,然後為sysfs 檔案系統建立乙個vfsmount物件、根dentry 和 根inode 結構。

kmem_cache_create函式的作用是建立乙個memory cache物件。在第一章核心基礎層一節分析過,建立乙個slab物件,同時指定物件的大小,以後可以利用這個物件申請記憶體。

sysfs 檔案系統提供函式sysfs_get_sb,建立檔案系統超級塊物件。sysfs_get_sb函式的實現和aufs檔案系統一樣,通過呼叫核心提供的get_sb_single建立超級塊物件。sysfs呼叫get_sb_single時,提供sysfs_fill_super 函式作為sysfs檔案系統超級塊的賦值函式。 這個賦值函式和aufs的賦值函式類似

4.1.2 sysfs檔案系統目錄的建立

對於檔案系統,關心檔案和目錄的建立刪除以及讀寫

1)呼叫sysfs_create_dir 函式建立目錄檔案

sysfs檔案系統使用sysfs_create_dir函式建立目錄檔案:

int sysfs_create_dir(struct kobject *kobj)

struct dentry *dentry = null;

struct dentry *parent;

int error = 0;

bug_on(!kobj);

/*設定父dentry,如果沒有父dentry,指定檔案系統的root dentry 為父 dentry */

if(kobj->parent)

parent = kobject->parent->dentry;

else if (sysfs_mount && sys_mount->mnt_sb)

parent = sysfs_mount->mnt_sb->s_root;

else

return -efault;

error = create_dir (kobj, parent, kobject_name(kobj), &dentry);

if (!error)

kobj->dentry = dentry;

return error;

struct kobject ;

sysfs_create_dir的輸入引數是乙個kobject指標,結構kobject 和 sysfs 檔案系統結合緊密 ,包含乙個dentry指標。從第2章分析的知識點我們了解到,dentry代表著檔案系統內部的層次關係,而包含dentry指標的結構kobject可以對應到sysfs檔案系統的乙個目錄,這個dentry指標就是目錄檔案的dentry。

2) 呼叫create_dir 實際執行目錄的建立

sysfs_create_dir呼叫create_dir實際執行目錄的建立,**如下:

struct int create_dir( struct kobject * k , struct dentry * p , const char * n , struct dentry ** d )

int error;

/* 指定是乙個目錄操作 */

umode_t mode = s_ifdir | s_irwxu | s_irugo | s_ixugo;

mutex_lock( & p->d_inode->i_mutex );

*d = lookup_one_len(n, p, strlen(n));

if (! is_err(*d)) {

/* 如果dirdent物件存在,退出返回錯誤,否則建立乙個新的 dirent  */

if (sysfs_dirent_exist ( p->d_fsdata, n)

error = -eexist;

else

error = sysfs_make_dirent( p->d_fsdata, *d, k, mode, sysfs_dir);

create_dir函式的第一部分是呼叫 lookup_one_len 在dentry cache 裡面查詢同名的 dentry 。 如果沒有,則建立乙個新的dentry。lookup_one_len函式前文已經分析。

新的結構:sysfs_dirent結構。對sysfs檔案系統內的每乙個目錄和檔案,都要為之建立乙個sysfs_dirent物件。

3)呼叫sysfs_make_dirent函式建立乙個sysfs_dirent結構

4.1.3 普通檔案的建立

4.2 sysfs檔案的開啟操作

4.2.1  為檔案建立inode結構

4.2.2  為dentry結構繫結屬性

4.2.4  呼叫檔案系統的open函式

4.3  sysfs檔案的讀寫

4.3.1 讀檔案的分析過程

4.3.2 寫檔案的過程分析

4.4  kobject結構

4.4.1  kobject 和 kset 的關係

4.4.2  kobject 例項:匯流排的祖冊

4.5、小結

核心中的檔案系統還有ramfs、 debugfs 、 configfs 、 proc 等

USB和sysfs檔案系統

由於單個usb物理裝置的複雜性,裝置在sysfs中的表示也非常複雜。無論是物理usb裝置 用struct usb device 表示 還是單獨的usb介面 用struct usb inte ce 表示 在sysfs中均表示為單獨的裝置 這是因為這2個結構都包含乙個struct device結構 例如...

USB和sysfs檔案系統

2007年08月31日 星期五 19 32 由於單個usb物理裝置的複雜性,裝置在sysfs中的表示也非常複雜。無論是物理usb裝置 用struct usb device表示 還是單獨的usb介面 用struct usb inte ce表示 在sysfs中均表示為單獨的裝置 這是因為這2個結構都包含...

USB和sysfs檔案系統

2007年08月31日 星期五 19 32 由於單個usb物理裝置的複雜性,裝置在sysfs中的表示也非常複雜。無論是物理usb裝置 用struct usb device表示 還是單獨的usb介面 用struct usb inte ce表示 在sysfs中均表示為單獨的裝置 這是因為這2個結構都包含...