sysfs檔案系統

2022-08-13 18:27:17 字數 4424 閱讀 2527

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

sysfs提供一種機制,使得可以顯式的描述核心物件、物件屬性及物件間關係。sysfs有兩組介面,一組針對核心,用於將裝置對映到檔案系統中,另一組針對使用者程式,用於讀取或操作這些裝置。表2描述了核心中的sysfs要素及其在使用者空間的表現:

sysfs在核心中的組成要素

在使用者空間的顯示

核心物件(kobject)

目錄物件屬性(attribute)

檔案物件關係(relationship)

鏈結(symbolic link)

表2:sysfs內部結構與外部表現

在ubuntu或fedora等linux系統中,我們可以用ls –f 《路徑》命令來通過檔案字尾檢視檔案型別。「/」表示資料夾,「@」表示鏈結,沒有字尾就是檔案了。

/sys 下的子目錄

所包含的內容

/sys/devices

這是核心對系統中所有裝置的分層次表達模型,也是/sys檔案系統管理裝置的最重要的目錄結構;

/sys/dev

這個目錄下維護乙個按字元裝置和塊裝置的主次號碼(major:minor)鏈結到真實的裝置(/sys/devices下)的符號鏈結檔案;

/sys/bus

這是核心裝置按匯流排型別分層放置的目錄結構, devices 中的所有裝置都是連線於某種匯流排之下,在這裡的每一種具體匯流排之下可以找到每乙個具體裝置的符號鏈結,它也是構成 linux 統一裝置模型的一部分;

/sys/class

這是按照裝置功能分類的裝置模型,如系統所有輸入裝置都會出現在/sys/class/input 之下,而不論它們是以何種匯流排連線到系統。它也是構成 linux 統一裝置模型的一部分;

/sys/kernel

這裡是核心所有可調整引數的位置,目前只有 uevent_helper, kexec_loaded, mm, 和新式的 slab 分配器等幾項較新的設計在使用它,其它核心可調整引數仍然位於sysctl(/proc/sys/kernel) 介面中;

/sys/module

這裡有系統中所有模組的資訊,不論這些模組是以內聯(inlined)方式編譯到核心映像檔案(vmlinuz)中還是編譯為外部模組(ko檔案),都可能會出現在/sys/module 中:

沒有非0屬性引數的內聯模組不會出現於此。

/sys/power

這裡是系統中電源選項,這個目錄下有幾個屬性檔案可以用於控制整個機器的電源狀態,如可以向其中寫入控制命令讓機器關機、重啟等。

表3:sysfs目錄結構

sysfs_dirent是組成sysfs單元的基本資料結構,它是sysfs資料夾或檔案在記憶體中的代表。sysfs_dirent只表示檔案型別(資料夾/普通檔案/二進位制檔案/鏈結檔案)及層級關係,其它資訊都儲存在對應的inode中。我們建立或刪除乙個sysfs檔案或資料夾事實上只是對以sysfs_dirent為節點的樹的節點的新增或刪除。sysfs_dirent資料結構如下:

struct sysfs_dirent d_u;

void *d_fsdata;                    /* 與檔案系統相關的資料,在sysfs中指向sysfs_dirent */

unsigned char d_iname[dname_inline_len_min];      /* 存放短檔名 */

sysfs_dirent、inode、dentry三者關係:

圖3-1:sysfs在記憶體中的形態

如上圖sysfs超級塊sysfs_sb、dentry根目錄root、sysfs_direct根目錄sysfs_root都是在sysfs初始化時建立。

sysfs_root下的子節點是新增裝置物件或物件屬性時呼叫sysfs_create_dir/ sysfs_create_file建立的,同時會申請對應的inode的索引號s_ino。注意此時並未建立inode。

inode是在用到的時候呼叫sysfs_get_inode函式建立並依據sysfs_sb位址和申請到的s_ino索引計算雜湊表位置放入其中。

dentry的子節點也是需要用的時候才會建立。比如open檔案時,會呼叫path_walk根據路徑一層層的查詢指定dentry,如果找不到,則建立乙個,並呼叫父dentry的inode的lookup函式(sysfs檔案系統的為sysfs_lookup)查詢對應的子inode填充指定的dentry。

這裡有必要介紹一下sysfs_lookup的實現,以保證我們更加清晰地了解這個過程,函式主體如下:

static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd)

struct dentry *ret = null;

struct sysfs_dirent *parent_sd = dentry->d_parent->d_fsdata; //獲取父sysfs_direct

struct sysfs_dirent *sd;

struct inode *inode;

mutex_lock(&sysfs_mutex);

/* 在父sysfs_direct查詢名為dentry->d_name.name的節點 */

sd = sysfs_find_dirent(parent_sd, dentry->d_name.name);

/* no such entry */

if (!sd) {

ret = err_ptr(-enoent);

goto out_unlock;

/* 這兒就是通過sysfs_direct獲取對應的inode,sysfs_get_inode實現原理上面已經介紹過了 */

/* attach dentry and inode */

inode = sysfs_get_inode(sd);

if (!inode) {

ret = err_ptr(-enomem);

goto out_unlock;

/* 填充目錄項,至此乙個目錄項建立完畢 */

/* instantiate and hash dentry */

dentry->d_op = &sysfs_dentry_ops;   /* 填充目錄項的操作方法,該方法只提供一釋放inode函式sysfs_d_iput */

dentry->d_fsdata = sysfs_get(sd);        //填充sysfs_direct

d_instantiate(dentry, inode);                 //填充inode

d_rehash(dentry);                               //將dentry加入hash表

out_unlock:

mutex_unlock(&sysfs_mutex);

return ret;

圖3-2是從網上找到的,清晰地描述了file和dentry以及inode之間的關係:

圖3-2:file、dentry、inode關係

程序每開啟乙個檔案,就會有乙個file結構與之對應。同乙個程序可以多次開啟同乙個檔案而得到多個不同的file結構,file結構描述了被開啟檔案的屬性,讀寫的偏移指標等等當前資訊。

兩個不同的file結構可以對應同乙個dentry結構。程序多次開啟同乙個檔案時,對應的只有乙個dentry結構。dentry結構儲存目錄項和對應檔案(inode)的資訊。

在儲存介質中,每個檔案對應唯一的inode結點,但是,每個檔案又可以有多個檔名。即可以通過不同的檔名訪問同乙個檔案。這裡多個檔名對應乙個檔案的關係在資料結構中表示就是dentry和inode的關係。

inode中不儲存檔案的名字,它只儲存節點號;而dentry則儲存有名字和與其對應的節點號,所以就可以通過不同的dentry訪問同乙個inode。

sysfs與普通檔案系統的最大差異是,sysfs不會申請任何記憶體空間來儲存檔案的內容。事實上再不對檔案操作時,檔案是不存在的。只有使用者讀或寫檔案時,sysfs才會申請一頁記憶體(只有一頁),用於儲存將要讀取的檔案資訊。如果作讀操作,sysfs就會呼叫檔案的父物件(資料夾kobject)的屬性處理函式kobject->ktype->sysfs_ops->show,然後通過show函式來呼叫包含該物件的外層裝置(或驅動、匯流排等)的屬性的show函式來獲取硬體裝置的對應屬性值,然後將該值拷貝到使用者空間的buff,這樣就完成了讀操作。寫操作也類似,都要進行核心空間ßà使用者空間記憶體的拷貝,以保護核心**的安全執行。

圖3-1為使用者空間程式讀sysfs檔案的處理流程,其他操作類似:

圖3-3:使用者空間程式讀sysfs檔案的處理流程

**:

sysfs檔案系統

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

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 檔案系統,它是基於 核心的資料結構 因此組織結構上更加嚴密。它的設計使核心的資訊更易獲取,而且更加清晰。核心空間與使用者空間的對映關係如下表所示 核心空間...