sysfs檔案系統

2021-06-20 07:37:19 字數 3762 閱讀 4673

sysfs是用來向使用者空間匯出核心物件的一種檔案系統,通過它,使用者空間程式可以檢視、甚至修改核心資料結構。該檔案系統是基於核心資料結構kobject建立起來的,同時該檔案系統的目錄結構反映了相關核心資料結構的層次結構。由於kobject是組成裝置模型的基本結構,因此sysfs也包括了系統中裝置的資訊,它提供了系統硬體的拓撲資訊。

由於sysfs提供了訪問、修改核心資料結構的一種手段,因而核心模組也可以通過該檔案系統向使用者空間匯出介面用於訪問、修改模組的引數。

在引入sysfs後,核心向使用者到處介面的方式有/proc檔案系統,sysfs檔案系統,ioctl命令。

雖然sysfs的資訊來自於kobject,但是kobject和sysfs的關聯不是自動建立的,必須通過kobject_add才能把乙個kobject新增到sysfs中。

由於核心中使用kobject的主要部件是硬體相關的部分,因而sysfs包含的最主要的內容就是硬體相關的內容,包括匯流排、裝置、驅動程式等。sysfs掛載點為/sys

rover$ ls /sys

block  bus  class  dev  devices  firmware  fs  hypervisor  kernel  module  power

sysfs使用sysfs_dirent來表示乙個目錄或檔案節點,其資料結構如下:

struct sysfs_dirent  u;

const void *s_ns; /* namespace tag */

unsigned int s_hash; /* ns + name hash */

union ;

unsigned short s_flags;

umode_t s_mode;

unsigned int s_ino;

struct sysfs_inode_attrs *s_iattr;

};

其中

struct sysfs_elem_dir ;

struct sysfs_elem_symlink ;

struct sysfs_elem_attr ;

struct sysfs_elem_bin_attr ;

struct sysfs_inode_attrs ;

sysfs使用dentry的d_fsdata來儲存對應的sysfs_dirent,因此通過dentry就能找到對應的sysfs_dirent。

在sysfs節點的四種型別中:

struct attribute ;
其定義如下

struct bin_attribute ;
該屬性各個域的含義很明顯。

int sysfs_create_bin_file(struct kobject *kobj,  const struct bin_attribute *attr);

void sysfs_remove_bin_file(struct kobject *kobj, const struct bin_attribute *attr);

int sysfs_create_link(struct kobject *kobj, struct kobject *target, const char *name);

void sysfs_delete_link(struct kobject *kobj, struct kobject *targ, const char *name);

這裡只討論了鏈結檔案,二進位制數形檔案的建立,根據kobject的內容屬性好像少了目錄和常規屬性的建立,常規屬性的建立在kobject中有描述,而目錄的建立則由kobject框架自動完成,不需要呼叫者關心。

如果乙個核心部件需要定義自己的屬性,實現方案也很簡單,只需要定義如下的結構:

struct self_attribute;
然後再sysfs需要屬性時,將slef_attriute的attr提供給sysfs即可。這樣sysfs仍可以使用自己所通用的struct attribute結構,而模組自己可以很容易的通過contanier_of巨集得到自己所定義的自定義屬性。

使用sysfs檔案系統之前必須將其初始化並且掛載到系統中,該過程和proc檔案系統完全類似。sysfs檔案系統的的初始化主要完成:

在sysfs的mount函式中會呼叫sysfs_fill_super,它會

從上述描述可以看出,其和proc檔案系統的初始化、以及mount是類似的。

設定sysfs的inode_operations和file_operations的工作是由sysfs_get_inode函式完成的,它最終呼叫函式sysfs_init_inode來完成這個工作。

在刪除乙個sysfs節點時,sysfs會首先保證核心沒有任何對sysfs內容的引用,這通過s_active來保證,然後在對該kobject的常規引用也全部消失後,就會真正刪除該kobject。其流程大致為:

首先將乙個特殊值sd_deactivated_bias加到s_active上,然後檢查結果是否仍然為該值,如果結果仍然是該值,則和其它檔案的刪除類似,根據引用計數是否為0進行相應的處理,否則

在該kobject的u.completion上等待

能夠結束該等待的就是對活動引用計數的put動作,在活動引用計數的put操作中,會進行檢查,如果減1後的值為sd_deactivated_bias則就呼叫complete(sd->u.completion)結束該等待。

在檔案操作中,inode檔案操作相對比較簡單,如果是目錄,則提供有乙個查詢函式用於查詢乙個dentry,如果是普通檔案,則提供有設定、檢視檔案屬性的函式。相對比較負責的是實際的檔案操作。

為了在核心和使用者空間互動資料,sysfs還提供了乙個資料結構來緩衝這種資料:

struct sysfs_buffer ;
緩衝區列表與開啟該sysfs的檔案以及該sysfs的sysfs_dirent的關係如下所示:

sysfs_ops結構的內容如下,需要進行讀寫的節點需要提供相應的函式。

struct sysfs_ops ;
如果是普通屬性檔案,則在sysfs_get_inode中會將檔案操作指標設定為sysfs_file_operations,其中包含了開啟檔案的函式sysfs_open_file,它會完成開啟檔案的操作。

如果是普通屬性檔案,則在sysfs_get_inode中會將檔案操作指標設定為sysfs_file_operations,其中包含了開啟檔案的函式sysfs_read_file。該函式比較簡單,它會

如果不需要填充,則直接從buffer中讀取

如果是普通屬性檔案,則在sysfs_get_inode中會將檔案操作指標設定為sysfs_file_operations,其中包含了開啟檔案的函式sysfs_write_file,該函式也很簡單,它。

從上述描述可以看出,乙個sysfs的實現者只需要將自己的真正的讀寫函式放到kobject的kobj_type的sysfs_ops中即可被呼叫到。

由於sysfs檔案系統是基於kobject構建的,而kobject內嵌在其它各種核心資料結構中,相應的核心框架都已經包括了註冊到sysfs中的**,因而只需要遵循相應模組所屬框架的規則即可完成向sysfs新增新的內容。

sysfs檔案系統

sysfs是乙個基於記憶體的檔案系統,它的作用是將核心資訊以檔案的方式提供給使用者程式使用。該檔案系統的目錄層次結構嚴格按照核心的資料結構組織。除了二進位制檔案外 只有特殊場合才使用 sysfs檔案內容均以ascii格式儲存,且乙個檔案只儲存乙個資料,另外,乙個檔案不可大於乙個記憶體頁 通常為409...

USB和sysfs檔案系統

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

linux之sysfs檔案系統

介紹sysfs 檔案系統 linux 2.6 核心中引入了 sysfs 檔案系統,是使用者空間與核心空間進行互動的乙個媒介。比起古老的 proc 檔案系統,它是基於 核心的資料結構 因此組織結構上更加嚴密。它的設計使核心的資訊更易獲取,而且更加清晰。核心空間與使用者空間的對映關係如下表所示 核心空間...