sysfs文件系統的建立【轉】

来源:https://www.cnblogs.com/linhaostudy/archive/2018/01/28/8372710.html
-Advertisement-
Play Games

http://blog.csdn.net/dndxhej/article/details/7434615 對sysfs和設備模型有瞭解的都會知道sysfs實際是為了將設備模型導出到用戶空間的一個記憶體文件系統。 設備模型的關鍵結構體kobject會組成設備模型的樹形結構,而sysfs的關鍵結構體sys ...


http://blog.csdn.net/dndxhej/article/details/7434615

對sysfs和設備模型有瞭解的都會知道sysfs實際是為了將設備模型導出到用戶空間的一個記憶體文件系統。

設備模型的關鍵結構體kobject會組成設備模型的樹形結構,而sysfs的關鍵結構體sysfs_dirent也是類似的樹形的結構,vfs中的dentry同樣是類似的樹形結構。

sysfs目錄文件的創建都是由設備模型的上層構件(bus device driver class)在註冊的時候調用它們內含的kobject(設備模型的底層基石)的添加註冊操作,而kobject的操作就調用sysfs文件系統的具體操作

 這些結構體是有聯繫的,但這一次我們先不過度關註他們的聯繫,僅僅對sysfs下目錄和文件的創建做個分析:

 

kobject結構體:

 1 struct kobject {
 2     const char        *name;
 3     struct list_head    entry;
 4     struct kobject        *parent;
 5     struct kset        *kset;
 6     struct kobj_type    *ktype;
 7     struct sysfs_dirent    *sd;
 8     struct kref        kref;
 9     unsigned int state_initialized:1;
10     unsigned int state_in_sysfs:1;
11     unsigned int state_add_uevent_sent:1;
12     unsigned int state_remove_uevent_sent:1;
13     unsigned int uevent_suppress:1;
14 };

 

 

 

sysfs_dirent結構中的union有四項:目錄(s_dir)、鏈接文件(s_symlink),屬性文件(s_attr)和二進位屬性文件(s_bin_attr)。

struct sysfs_dirent {
    atomic_t        s_count;
    atomic_t        s_active;
#ifdef CONFIG_DEBUG_LOCK_ALLOC
    struct lockdep_map    dep_map;
#endif
    struct sysfs_dirent    *s_parent;
    struct sysfs_dirent    *s_sibling;
    const char        *s_name;

    union {
        struct sysfs_elem_dir        s_dir;
        struct sysfs_elem_symlink    s_symlink;
        struct sysfs_elem_attr        s_attr;
        struct sysfs_elem_bin_attr    s_bin_attr;
    };

    unsigned int        s_flags;
    unsigned short        s_mode;
    ino_t            s_ino;
    struct sysfs_inode_attrs *s_iattr;
};

 

 

 我們vfs中有inode和entry兩種關鍵的對象,在很多文件系統的設計中,都會有類似omfs_inode和omfs_extent_entry等等結構體來抽象表明具體文件系統的節點和目錄項。

 而在sysfs中,不管是目錄還是文件,都用同一個結構體sysfs_dirent來表示,這個結構體可以說是inode和dentry的綜合,因為有:

1 unsignedint s_flags;
2 unsignedshort s_mode;
3 ino_t s_ino;

 

 等類似於inode的內容,也有:

1 structsysfs_dirent *s_parent;
2 structsysfs_dirent *s_sibling;
3 constchar *s_name;

 

等類似於dentry的內容。

 

 總的來說,sysfs_dirent結構體是sysfs和kobject建立連接的橋梁。

 

我們知道,kobject對應於sysfs下的一個目錄:

1 structsysfs_elem_dir {
2 structkobject     *kobj;
3 /*children list starts here and goes through sd->s_sibling */
4 structsysfs_dirent    *children;
5 };

 

上面的結構體緊密的將kobject和sysfs_dirent聯繫起來。kobject代表目錄,而對於代表目錄的sysfs_dirent,內嵌的sysfs_elem_dir有kobject的指針,所以kobject和sysfs_dirent是你中有我,我中有你。

不過對於文件就不一樣了,因為文件也有自己的sysfs_dirent,而文件並沒有自己的kobject。

 

在普通的文件系統中,比如omfs中,建立一個目錄的話,首先會從物理存儲介質(磁碟)中讀取相關信息填充omfs下的omfs_inode結構體,然後會建立vfs層的inode和dentry等結構體。

 

而在sysfs中,在建立目錄和文件時,只會通過sysfs_dirent結構體來建立目錄文件的層次結構,而看不到vfs中的dentry、inode。既然是linux下的文件系統,不管多麼特殊,肯定要有inode和dentry的,sysfs文件系統也不例外,只不過sysfs將建立inode和dentry的操作推到sysfs_lookup函數中來做,在sysfs_lookup中還會建立dentry與sysfs_dirtnt的關係。dentry->d_fsdata= sysfs_get(sd);

 

其實這個關係,在sysfs_fill_super就有體現:root->d_fsdata= &sysfs_root;

1 struct sysfs_dirent sysfs_root = {
2     .s_name        = "",
3     .s_count    = ATOMIC_INIT(1),
4     .s_flags    = SYSFS_DIR,
5     .s_mode        = S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO,
6     .s_ino        = 1,
7 };

 這個sysfs_root就是sysfs_dirent層次結構中的根。

 下麵是sysfs創建目錄的過程,註意的是這個過程只能通過kobject的操作來實現,在/sys下用mkdir是沒作用的:

 1 int sysfs_create_dir(struct kobject * kobj)
 2 {
 3     struct sysfs_dirent *parent_sd, *sd;
 4     int error = 0;
 5 
 6     BUG_ON(!kobj);
 7 
 8     if (kobj->parent)
 9         parent_sd = kobj->parent->sd;
10     else
11         parent_sd = &sysfs_root;
12 
13     error = create_dir(kobj, parent_sd, kobject_name(kobj), &sd);
14     if (!error)
15         kobj->sd = sd;
16     return error;
17 }

 

 

 1 static int create_dir(struct kobject *kobj, struct sysfs_dirent *parent_sd,
 2               const char *name, struct sysfs_dirent **p_sd)
 3 {
 4     umode_t mode = S_IFDIR| S_IRWXU | S_IRUGO | S_IXUGO;
 5     struct sysfs_addrm_cxt acxt;
 6     struct sysfs_dirent *sd;
 7     int rc;
 8 
 9     /* allocate */
10     sd = sysfs_new_dirent(name, mode, SYSFS_DIR);   //初始化sysfs_dirent結構體
11     if (!sd)
12         return -ENOMEM;
13     sd->s_dir.kobj = kobj;              //sysfs_dirent與kobject的聯繫建立
14 
15     /* link in */
16     sysfs_addrm_start(&acxt, parent_sd);
17     rc = sysfs_add_one(&acxt, sd);
18     sysfs_addrm_finish(&acxt);
19 
20     if (rc == 0)
21         *p_sd = sd;
22     else
23         sysfs_put(sd);
24     return rc;
25 }

在sysfs_add_one是層次關係的建立:

 1 int __sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
 2 {
 3     struct sysfs_inode_attrs *ps_iattr;
 4 
 5     if (sysfs_find_dirent(acxt->parent_sd, sd->s_name))
 6         return -EEXIST;
 7 
 8     sd->s_parent = sysfs_get(acxt->parent_sd);       //建立上下層次間的父子關係
 9 
10     sysfs_link_sibling(sd);                        //建立同一層次的兄弟關係
11 
12     /* Update timestamps on the parent */
13     ps_iattr = acxt->parent_sd->s_iattr;                    
14     if (ps_iattr) {
15         struct iattr *ps_iattrs = &ps_iattr->ia_iattr;
16         ps_iattrs->ia_ctime = ps_iattrs->ia_mtime = CURRENT_TIME;
17     }
18 
19     return 0;
20 }

 

在sysfs_link_sibling中關鍵代碼:

1     for (pos = &parent_sd->s_dir.children; *pos; pos = &(*pos)->s_sibling) {
2         if (sd->s_ino < (*pos)->s_ino)
3             break;
4     }

 

 根據s_ino從小到大的順序組成一個鏈。附上一個圖,這個關係就一目瞭然:

 

 從這個圖可以很清楚的看到sysfs中sysfs_dirent架成的樹形結構(註意他們的s_ino排列),這個結構和kobject,dentry的樹形結構幾乎一致,因為他們是有聯繫的,後面我們會一步步理清他們的聯繫,到時侯就明白sysfs是如何將設備模型(kobject)倒成文件系統的。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 18 01 26在v2ex上看到一妹紙發的《身為一個 21 歲的年輕程式員,我已經腰突了(躺》,哈哈,感同身受,想到這幾天我左腿麻木持續了好幾天,前幾天屁股疼的只要坐下就站不起來,不過站著卻一點事沒有,然後堅持站了好幾天,目前屁股不疼,腿麻的毛病還沒有恢復。。。[後續] 接觸到的https http ...
  • 新學一詞:達克效應。引出一句:“無知要比知識更容易產生自信。”—— 查爾斯·達爾文 寫在前面 在三亞呆了半個月了,三亞的冬天好熱啊,讓我回憶起了放暑假時下午百無聊賴的時光 { 一睡一下午٩(๑❛ᴗ❛๑)۶ }。 算是從昨天晚上開始調試WebSocket,代碼是16年初正常老代碼copy過來的,不過C ...
  • 前言 Spread for Windows Forms是功能最為強大的表格控制項,擁有靈活開放的對象模型和50,000個以上的API,使得開發人員幾乎可以定製所有的元素和介面。但另一方面,因為Spread的介面非常多,也有一些開發人員反映Spread的入門不太容易。希望我們編寫的“快速入門”系列文章, ...
  • 從記憶體中載入的程式集,無路徑 IIS中路徑 protected void Page_Load(object sender, EventArgs e) { Response.Write("程式集路徑"+System.Reflection.Assembly.GetExecutingAssembly().... ...
  • 【01】淺談HTTP在WebApi開發中的運用 【02】聊聊WebApi體繫結構 【03】詳解WebApi如何傳遞參數 【04】詳解WebApi測試和PostMan 【05】淺談WebApi Cores 【06】詳解WebApi 異常處理 【07】用WebAPI寫個基於EF的CURD 【08】淺談W ...
  • 源自:https://segmentfault.com/q/1010000000534091?_ea=178721 Model:很簡單,就是業務邏輯相關的數據對象,通常從資料庫映射而來,我們可以說是與資料庫對應的model。 View:也很簡單,就是展現出來的用戶界面。 基本上,絕大多數軟體所做的工 ...
  • 前面說過,每個線程都有自己的資源,但是代碼區是共用的,即每個線程都可以執行相同的函數。這可能帶來的問題就是幾個線程同時執行一個函數,導致數據的混亂,產生不可預料的結果,因此我們必須避免這種情況的發生。 C#提供了一個關鍵字lock,它可以把一段代碼定義為互斥段(critical section),互 ...
  • 1.最新版本 2.打開文件,將包含以下文件: Ext.Net.dll Ext.Net.Utilities.dll Ext.Net.xml Newtonsoft.Json.dll Newtonsoft.Json.xml 3.打開 Visual Studio,創建C#網站項目 打開菜單創建網站 彈出"創 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...