162306a36Sopenharmony_ciSPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci 362306a36Sopenharmony_ciChinese translated version of Documentation/filesystems/sysfs.rst 462306a36Sopenharmony_ci 562306a36Sopenharmony_ciIf you have any comment or update to the content, please contact the 662306a36Sopenharmony_cioriginal document maintainer directly. However, if you have a problem 762306a36Sopenharmony_cicommunicating in English you can also ask the Chinese maintainer for 862306a36Sopenharmony_cihelp. Contact the Chinese maintainer if this translation is outdated 962306a36Sopenharmony_cior if there is a problem with the translation. 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ciMaintainer: Patrick Mochel <mochel@osdl.org> 1262306a36Sopenharmony_ci Mike Murphy <mamurph@cs.clemson.edu> 1362306a36Sopenharmony_ciChinese maintainer: Fu Wei <tekkamanninja@gmail.com> 1462306a36Sopenharmony_ci--------------------------------------------------------------------- 1562306a36Sopenharmony_ciDocumentation/filesystems/sysfs.rst 的中文翻譯 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci如果想評論或更新本文的內容,請直接聯繫原文檔的維護者。如果你使用英文 1862306a36Sopenharmony_ci交流有困難的話,也可以向中文版維護者求助。如果本翻譯更新不及時或者翻 1962306a36Sopenharmony_ci譯存在問題,請聯繫中文版維護者。 2062306a36Sopenharmony_ci英文版維護者: Patrick Mochel <mochel@osdl.org> 2162306a36Sopenharmony_ci Mike Murphy <mamurph@cs.clemson.edu> 2262306a36Sopenharmony_ci中文版維護者: 傅煒 Fu Wei <tekkamanninja@gmail.com> 2362306a36Sopenharmony_ci中文版翻譯者: 傅煒 Fu Wei <tekkamanninja@gmail.com> 2462306a36Sopenharmony_ci中文版校譯者: 傅煒 Fu Wei <tekkamanninja@gmail.com> 2562306a36Sopenharmony_ci繁體中文版校譯者:胡皓文 Hu Haowen <src.res.211@gmail.com> 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci以下爲正文 2962306a36Sopenharmony_ci--------------------------------------------------------------------- 3062306a36Sopenharmony_cisysfs - 用於導出內核對象(kobject)的文件系統 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ciPatrick Mochel <mochel@osdl.org> 3362306a36Sopenharmony_ciMike Murphy <mamurph@cs.clemson.edu> 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci修訂: 16 August 2011 3662306a36Sopenharmony_ci原始版本: 10 January 2003 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_cisysfs 簡介: 4062306a36Sopenharmony_ci~~~~~~~~~~ 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cisysfs 是一個最初基於 ramfs 且位於內存的文件系統。它提供導出內核 4362306a36Sopenharmony_ci數據結構及其屬性,以及它們之間的關聯到用戶空間的方法。 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cisysfs 始終與 kobject 的底層結構緊密相關。請閱讀 4662306a36Sopenharmony_ciDocumentation/core-api/kobject.rst 文檔以獲得更多關於 kobject 接口的 4762306a36Sopenharmony_ci信息。 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci使用 sysfs 5162306a36Sopenharmony_ci~~~~~~~~~~~ 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci只要內核配置中定義了 CONFIG_SYSFS ,sysfs 總是被編譯進內核。你可 5462306a36Sopenharmony_ci通過以下命令掛載它: 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci mount -t sysfs sysfs /sys 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci創建目錄 6062306a36Sopenharmony_ci~~~~~~~~ 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci任何 kobject 在系統中註冊,就會有一個目錄在 sysfs 中被創建。這個 6362306a36Sopenharmony_ci目錄是作爲該 kobject 的父對象所在目錄的子目錄創建的,以準確地傳遞 6462306a36Sopenharmony_ci內核的對象層次到用戶空間。sysfs 中的頂層目錄代表著內核對象層次的 6562306a36Sopenharmony_ci共同祖先;例如:某些對象屬於某個子系統。 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ciSysfs 在與其目錄關聯的 kernfs_node 對象中內部保存一個指向實現 6862306a36Sopenharmony_ci目錄的 kobject 的指針。以前,這個 kobject 指針被 sysfs 直接用於 6962306a36Sopenharmony_cikobject 文件打開和關閉的引用計數。而現在的 sysfs 實現中,kobject 7062306a36Sopenharmony_ci引用計數只能通過 sysfs_schedule_callback() 函數直接修改。 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci屬性 7462306a36Sopenharmony_ci~~~~ 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_cikobject 的屬性可在文件系統中以普通文件的形式導出。Sysfs 爲屬性定義 7762306a36Sopenharmony_ci了面向文件 I/O 操作的方法,以提供對內核屬性的讀寫。 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci屬性應爲 ASCII 碼文本文件。以一個文件只存儲一個屬性值爲宜。但一個 8162306a36Sopenharmony_ci文件只包含一個屬性值可能影響效率,所以一個包含相同數據類型的屬性值 8262306a36Sopenharmony_ci數組也被廣泛地接受。 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci混合類型、表達多行數據以及一些怪異的數據格式會遭到強烈反對。這樣做是 8562306a36Sopenharmony_ci很丟臉的,而且其代碼會在未通知作者的情況下被重寫。 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci一個簡單的屬性結構定義如下: 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_cistruct attribute { 9162306a36Sopenharmony_ci char * name; 9262306a36Sopenharmony_ci struct module *owner; 9362306a36Sopenharmony_ci umode_t mode; 9462306a36Sopenharmony_ci}; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ciint sysfs_create_file(struct kobject * kobj, const struct attribute * attr); 9862306a36Sopenharmony_civoid sysfs_remove_file(struct kobject * kobj, const struct attribute * attr); 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci一個單獨的屬性結構並不包含讀寫其屬性值的方法。子系統最好爲增刪特定 10262306a36Sopenharmony_ci對象類型的屬性定義自己的屬性結構體和封裝函數。 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci例如:驅動程序模型定義的 device_attribute 結構體如下: 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_cistruct device_attribute { 10762306a36Sopenharmony_ci struct attribute attr; 10862306a36Sopenharmony_ci ssize_t (*show)(struct device *dev, struct device_attribute *attr, 10962306a36Sopenharmony_ci char *buf); 11062306a36Sopenharmony_ci ssize_t (*store)(struct device *dev, struct device_attribute *attr, 11162306a36Sopenharmony_ci const char *buf, size_t count); 11262306a36Sopenharmony_ci}; 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ciint device_create_file(struct device *, const struct device_attribute *); 11562306a36Sopenharmony_civoid device_remove_file(struct device *, const struct device_attribute *); 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci爲了定義設備屬性,同時定義了一下輔助宏: 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci#define DEVICE_ATTR(_name, _mode, _show, _store) \ 12062306a36Sopenharmony_cistruct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store) 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci例如:聲明 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_cistatic DEVICE_ATTR(foo, S_IWUSR | S_IRUGO, show_foo, store_foo); 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci等同於如下代碼: 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_cistatic struct device_attribute dev_attr_foo = { 12962306a36Sopenharmony_ci .attr = { 13062306a36Sopenharmony_ci .name = "foo", 13162306a36Sopenharmony_ci .mode = S_IWUSR | S_IRUGO, 13262306a36Sopenharmony_ci .show = show_foo, 13362306a36Sopenharmony_ci .store = store_foo, 13462306a36Sopenharmony_ci }, 13562306a36Sopenharmony_ci}; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci子系統特有的回調函數 13962306a36Sopenharmony_ci~~~~~~~~~~~~~~~~~~~ 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci當一個子系統定義一個新的屬性類型時,必須實現一系列的 sysfs 操作, 14262306a36Sopenharmony_ci以幫助讀寫調用實現屬性所有者的顯示和儲存方法。 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_cistruct sysfs_ops { 14562306a36Sopenharmony_ci ssize_t (*show)(struct kobject *, struct attribute *, char *); 14662306a36Sopenharmony_ci ssize_t (*store)(struct kobject *, struct attribute *, const char *, size_t); 14762306a36Sopenharmony_ci}; 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci[子系統應已經定義了一個 struct kobj_type 結構體作爲這個類型的 15062306a36Sopenharmony_ci描述符,並在此保存 sysfs_ops 的指針。更多的信息參見 kobject 的 15162306a36Sopenharmony_ci文檔] 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_cisysfs 會爲這個類型調用適當的方法。當一個文件被讀寫時,這個方法會 15462306a36Sopenharmony_ci將一般的kobject 和 attribute 結構體指針轉換爲適當的指針類型後 15562306a36Sopenharmony_ci調用相關聯的函數。 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci示例: 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci#define to_dev_attr(_attr) container_of(_attr, struct device_attribute, attr) 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_cistatic ssize_t dev_attr_show(struct kobject *kobj, struct attribute *attr, 16362306a36Sopenharmony_ci char *buf) 16462306a36Sopenharmony_ci{ 16562306a36Sopenharmony_ci struct device_attribute *dev_attr = to_dev_attr(attr); 16662306a36Sopenharmony_ci struct device *dev = kobj_to_dev(kobj); 16762306a36Sopenharmony_ci ssize_t ret = -EIO; 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci if (dev_attr->show) 17062306a36Sopenharmony_ci ret = dev_attr->show(dev, dev_attr, buf); 17162306a36Sopenharmony_ci if (ret >= (ssize_t)PAGE_SIZE) { 17262306a36Sopenharmony_ci printk("dev_attr_show: %pS returned bad count\n", 17362306a36Sopenharmony_ci dev_attr->show); 17462306a36Sopenharmony_ci } 17562306a36Sopenharmony_ci return ret; 17662306a36Sopenharmony_ci} 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci讀寫屬性數據 18162306a36Sopenharmony_ci~~~~~~~~~~~~ 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci在聲明屬性時,必須指定 show() 或 store() 方法,以實現屬性的 18462306a36Sopenharmony_ci讀或寫。這些方法的類型應該和以下的設備屬性定義一樣簡單。 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_cissize_t (*show)(struct device *dev, struct device_attribute *attr, char *buf); 18762306a36Sopenharmony_cissize_t (*store)(struct device *dev, struct device_attribute *attr, 18862306a36Sopenharmony_ci const char *buf, size_t count); 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_ci也就是說,他們應只以一個處理對象、一個屬性和一個緩衝指針作爲參數。 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_cisysfs 會分配一個大小爲 (PAGE_SIZE) 的緩衝區並傳遞給這個方法。 19362306a36Sopenharmony_ciSysfs 將會爲每次讀寫操作調用一次這個方法。這使得這些方法在執行時 19462306a36Sopenharmony_ci會出現以下的行爲: 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci- 在讀方面(read(2)),show() 方法應該填充整個緩衝區。回想屬性 19762306a36Sopenharmony_ci 應只導出了一個屬性值或是一個同類型屬性值的數組,所以這個代價將 19862306a36Sopenharmony_ci 不會不太高。 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci 這使得用戶空間可以局部地讀和任意的向前搜索整個文件。如果用戶空間 20162306a36Sopenharmony_ci 向後搜索到零或使用『0』偏移執行一個pread(2)操作,show()方法將 20262306a36Sopenharmony_ci 再次被調用,以重新填充緩存。 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci- 在寫方面(write(2)),sysfs 希望在第一次寫操作時得到整個緩衝區。 20562306a36Sopenharmony_ci 之後 Sysfs 傳遞整個緩衝區給 store() 方法。 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci 當要寫 sysfs 文件時,用戶空間進程應首先讀取整個文件,修該想要 20862306a36Sopenharmony_ci 改變的值,然後回寫整個緩衝區。 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci 在讀寫屬性值時,屬性方法的執行應操作相同的緩衝區。 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci註記: 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci- 寫操作導致的 show() 方法重載,會忽略當前文件位置。 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci- 緩衝區應總是 PAGE_SIZE 大小。對於i386,這個值爲4096。 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci- show() 方法應該返回寫入緩衝區的字節數,也就是 scnprintf()的 21962306a36Sopenharmony_ci 返回值。 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci- show() 方法在將格式化返回值返回用戶空間的時候,禁止使用snprintf()。 22262306a36Sopenharmony_ci 如果可以保證不會發生緩衝區溢出,可以使用sprintf(),否則必須使用 22362306a36Sopenharmony_ci scnprintf()。 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci- store() 應返回緩衝區的已用字節數。如果整個緩存都已填滿,只需返回 22662306a36Sopenharmony_ci count 參數。 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ci- show() 或 store() 可以返回錯誤值。當得到一個非法值,必須返回一個 22962306a36Sopenharmony_ci 錯誤值。 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci- 一個傳遞給方法的對象將會通過 sysfs 調用對象內嵌的引用計數固定在 23262306a36Sopenharmony_ci 內存中。儘管如此,對象代表的物理實體(如設備)可能已不存在。如有必要, 23362306a36Sopenharmony_ci 應該實現一個檢測機制。 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci一個簡單的(未經實驗證實的)設備屬性實現如下: 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_cistatic ssize_t show_name(struct device *dev, struct device_attribute *attr, 23862306a36Sopenharmony_ci char *buf) 23962306a36Sopenharmony_ci{ 24062306a36Sopenharmony_ci return scnprintf(buf, PAGE_SIZE, "%s\n", dev->name); 24162306a36Sopenharmony_ci} 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_cistatic ssize_t store_name(struct device *dev, struct device_attribute *attr, 24462306a36Sopenharmony_ci const char *buf, size_t count) 24562306a36Sopenharmony_ci{ 24662306a36Sopenharmony_ci snprintf(dev->name, sizeof(dev->name), "%.*s", 24762306a36Sopenharmony_ci (int)min(count, sizeof(dev->name) - 1), buf); 24862306a36Sopenharmony_ci return count; 24962306a36Sopenharmony_ci} 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_cistatic DEVICE_ATTR(name, S_IRUGO, show_name, store_name); 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci(注意:真正的實現不允許用戶空間設置設備名。) 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci頂層目錄布局 25762306a36Sopenharmony_ci~~~~~~~~~~~~ 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_cisysfs 目錄的安排顯示了內核數據結構之間的關係。 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci頂層 sysfs 目錄如下: 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ciblock/ 26462306a36Sopenharmony_cibus/ 26562306a36Sopenharmony_ciclass/ 26662306a36Sopenharmony_cidev/ 26762306a36Sopenharmony_cidevices/ 26862306a36Sopenharmony_cifirmware/ 26962306a36Sopenharmony_cinet/ 27062306a36Sopenharmony_cifs/ 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_cidevices/ 包含了一個設備樹的文件系統表示。他直接映射了內部的內核 27362306a36Sopenharmony_ci設備樹,反映了設備的層次結構。 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_cibus/ 包含了內核中各種總線類型的平面目錄布局。每個總線目錄包含兩個 27662306a36Sopenharmony_ci子目錄: 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ci devices/ 27962306a36Sopenharmony_ci drivers/ 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_cidevices/ 包含了系統中出現的每個設備的符號連結,他們指向 root/ 下的 28262306a36Sopenharmony_ci設備目錄。 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_cidrivers/ 包含了每個已爲特定總線上的設備而掛載的驅動程序的目錄(這裡 28562306a36Sopenharmony_ci假定驅動沒有跨越多個總線類型)。 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_cifs/ 包含了一個爲文件系統設立的目錄。現在每個想要導出屬性的文件系統必須 28862306a36Sopenharmony_ci在 fs/ 下創建自己的層次結構(參見Documentation/filesystems/fuse.rst)。 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_cidev/ 包含兩個子目錄: char/ 和 block/。在這兩個子目錄中,有以 29162306a36Sopenharmony_ci<major>:<minor> 格式命名的符號連結。這些符號連結指向 sysfs 目錄 29262306a36Sopenharmony_ci中相應的設備。/sys/dev 提供一個通過一個 stat(2) 操作結果,查找 29362306a36Sopenharmony_ci設備 sysfs 接口快捷的方法。 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ci更多有關 driver-model 的特性信息可以在 Documentation/driver-api/driver-model/ 29662306a36Sopenharmony_ci中找到。 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ciTODO: 完成這一節。 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci當前接口 30362306a36Sopenharmony_ci~~~~~~~~ 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci以下的接口層普遍存在於當前的sysfs中: 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci- 設備 (include/linux/device.h) 30862306a36Sopenharmony_ci---------------------------------- 30962306a36Sopenharmony_ci結構體: 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_cistruct device_attribute { 31262306a36Sopenharmony_ci struct attribute attr; 31362306a36Sopenharmony_ci ssize_t (*show)(struct device *dev, struct device_attribute *attr, 31462306a36Sopenharmony_ci char *buf); 31562306a36Sopenharmony_ci ssize_t (*store)(struct device *dev, struct device_attribute *attr, 31662306a36Sopenharmony_ci const char *buf, size_t count); 31762306a36Sopenharmony_ci}; 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci聲明: 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ciDEVICE_ATTR(_name, _mode, _show, _store); 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_ci增/刪屬性: 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ciint device_create_file(struct device *dev, const struct device_attribute * attr); 32662306a36Sopenharmony_civoid device_remove_file(struct device *dev, const struct device_attribute * attr); 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_ci- 總線驅動程序 (include/linux/device.h) 33062306a36Sopenharmony_ci-------------------------------------- 33162306a36Sopenharmony_ci結構體: 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_cistruct bus_attribute { 33462306a36Sopenharmony_ci struct attribute attr; 33562306a36Sopenharmony_ci ssize_t (*show)(const struct bus_type *, char * buf); 33662306a36Sopenharmony_ci ssize_t (*store)(const struct bus_type *, const char * buf, size_t count); 33762306a36Sopenharmony_ci}; 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_ci聲明: 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ciBUS_ATTR(_name, _mode, _show, _store) 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ci增/刪屬性: 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_ciint bus_create_file(struct bus_type *, struct bus_attribute *); 34662306a36Sopenharmony_civoid bus_remove_file(struct bus_type *, struct bus_attribute *); 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci- 設備驅動程序 (include/linux/device.h) 35062306a36Sopenharmony_ci----------------------------------------- 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_ci結構體: 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_cistruct driver_attribute { 35562306a36Sopenharmony_ci struct attribute attr; 35662306a36Sopenharmony_ci ssize_t (*show)(struct device_driver *, char * buf); 35762306a36Sopenharmony_ci ssize_t (*store)(struct device_driver *, const char * buf, 35862306a36Sopenharmony_ci size_t count); 35962306a36Sopenharmony_ci}; 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_ci聲明: 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ciDRIVER_ATTR(_name, _mode, _show, _store) 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ci增/刪屬性: 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ciint driver_create_file(struct device_driver *, const struct driver_attribute *); 36862306a36Sopenharmony_civoid driver_remove_file(struct device_driver *, const struct driver_attribute *); 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ci文檔 37262306a36Sopenharmony_ci~~~~ 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_cisysfs 目錄結構以及其中包含的屬性定義了一個內核與用戶空間之間的 ABI。 37562306a36Sopenharmony_ci對於任何 ABI,其自身的穩定和適當的文檔是非常重要的。所有新的 sysfs 37662306a36Sopenharmony_ci屬性必須在 Documentation/ABI 中有文檔。詳見 Documentation/ABI/README。 37762306a36Sopenharmony_ci 378