~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/translations/zh_TW/filesystems/sysfs.txt

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /Documentation/translations/zh_TW/filesystems/sysfs.txt (Version linux-6.12-rc7) and /Documentation/translations/zh_TW/filesystems/sysfs.txt (Version linux-5.18.19)


  1 SPDX-License-Identifier: GPL-2.0                    1 SPDX-License-Identifier: GPL-2.0
  2                                                     2 
  3 Chinese translated version of Documentation/fi      3 Chinese translated version of Documentation/filesystems/sysfs.rst
  4                                                     4 
  5 If you have any comment or update to the conte      5 If you have any comment or update to the content, please contact the
  6 original document maintainer directly.  Howeve      6 original document maintainer directly.  However, if you have a problem
  7 communicating in English you can also ask the       7 communicating in English you can also ask the Chinese maintainer for
  8 help.  Contact the Chinese maintainer if this       8 help.  Contact the Chinese maintainer if this translation is outdated
  9 or if there is a problem with the translation.      9 or if there is a problem with the translation.
 10                                                    10 
 11 Maintainer: Patrick Mochel      <mochel@osdl.or     11 Maintainer: Patrick Mochel      <mochel@osdl.org>
 12                 Mike Murphy <mamurph@cs.clemson     12                 Mike Murphy <mamurph@cs.clemson.edu>
 13 Chinese maintainer: Fu Wei <tekkamanninja@gmail     13 Chinese maintainer: Fu Wei <tekkamanninja@gmail.com>
 14 ----------------------------------------------     14 ---------------------------------------------------------------------
 15 Documentation/filesystems/sysfs.rst çš„ä¸­æ–‡ç     15 Documentation/filesystems/sysfs.rst 的中文翻譯
 16                                                    16 
 17 å¦‚æžœæƒ³è©•è«–æˆ–æ›´æ–°æœ¬æ–‡çš„å…§å®¹ï¼Œè«‹ç     17 如果想評論或更新本文的內容,請直接è¯ç¹«åŽŸæ–‡æª”的維護者。如果你使用英文
 18 交æµæœ‰å›°é›£çš„話,也å¯ä»¥å‘ä¸­æ–‡ç‰ˆç     18 交æµæœ‰å›°é›£çš„話,也å¯ä»¥å‘中文版維護者求助。如果本翻譯更新ä¸åŠæ™‚或者翻
 19 譯存在å•é¡Œï¼Œè«‹è¯ç¹«ä¸­æ–‡ç‰ˆç¶­è­·è€…ã     19 譯存在å•é¡Œï¼Œè«‹è¯ç¹«ä¸­æ–‡ç‰ˆç¶­è­·è€…。
 20 英文版維護者: Patrick Mochel    <mochel     20 英文版維護者: Patrick Mochel    <mochel@osdl.org>
 21                 Mike Murphy <mamurph@cs.clemson     21                 Mike Murphy <mamurph@cs.clemson.edu>
 22 中文版維護者: 傅煒 Fu Wei <tekkamanni     22 中文版維護者: 傅煒 Fu Wei <tekkamanninja@gmail.com>
 23 中文版翻譯者: 傅煒 Fu Wei <tekkamanni     23 中文版翻譯者: 傅煒 Fu Wei <tekkamanninja@gmail.com>
 24 中文版校譯者: 傅煒 Fu Wei <tekkamanni     24 中文版校譯者: 傅煒 Fu Wei <tekkamanninja@gmail.com>
 25 ç¹é«”中文版校譯者:胡皓文 Hu Haowen< !!  25 ç¹é«”中文版校譯者:胡皓文 Hu Haowen <src.res@email.cn>
 26                                                    26 
 27                                                    27 
 28 以下爲正文                                    28 以下爲正文
 29 ----------------------------------------------     29 ---------------------------------------------------------------------
 30 sysfs - 用於導出內核å°è±¡(kobject)çš„æ–     30 sysfs - 用於導出內核å°è±¡(kobject)的文件系統
 31                                                    31 
 32 Patrick Mochel  <mochel@osdl.org>                   32 Patrick Mochel  <mochel@osdl.org>
 33 Mike Murphy <mamurph@cs.clemson.edu>                33 Mike Murphy <mamurph@cs.clemson.edu>
 34                                                    34 
 35 修訂:    16 August 2011                          35 修訂:    16 August 2011
 36 原始版本:   10 January 2003                    36 原始版本:   10 January 2003
 37                                                    37 
 38                                                    38 
 39 sysfs 簡介:                                      39 sysfs 簡介:
 40 ~~~~~~~~~~                                         40 ~~~~~~~~~~
 41                                                    41 
 42 sysfs 是一個最åˆåŸºæ–¼ ramfs 且ä½æ–¼å…§     42 sysfs 是一個最åˆåŸºæ–¼ ramfs 且ä½æ–¼å…§å­˜çš„文件系統。它æ供導出內核
 43 數據çµæ§‹åŠå…¶å±¬æ€§ï¼Œä»¥åŠå®ƒå€‘ä¹‹é–“ç     43 數據çµæ§‹åŠå…¶å±¬æ€§ï¼Œä»¥åŠå®ƒå€‘之間的關è¯åˆ°ç”¨æˆ¶ç©ºé–“的方法。
 44                                                    44 
 45 sysfs 始終與 kobject 的底層çµæ§‹ç·Šå¯†ç     45 sysfs 始終與 kobject 的底層çµæ§‹ç·Šå¯†ç›¸é—œã€‚請閱讀
 46 Documentation/core-api/kobject.rst æ–‡æª”ä»¥ç     46 Documentation/core-api/kobject.rst 文檔以ç²å¾—更多關於 kobject 接å£çš„
 47 ä¿¡æ¯ã€‚                                          47 ä¿¡æ¯ã€‚
 48                                                    48 
 49                                                    49 
 50 使用 sysfs                                       50 使用 sysfs
 51 ~~~~~~~~~~~                                        51 ~~~~~~~~~~~
 52                                                    52 
 53 åªè¦å…§æ ¸é…置中定義了 CONFIG_SYSFS ï¼     53 åªè¦å…§æ ¸é…置中定義了 CONFIG_SYSFS ,sysfs 總是被編譯進內核。你å¯
 54 通éŽä»¥ä¸‹å‘½ä»¤æŽ›è¼‰å®ƒ:                       54 通éŽä»¥ä¸‹å‘½ä»¤æŽ›è¼‰å®ƒ:
 55                                                    55 
 56     mount -t sysfs sysfs /sys                      56     mount -t sysfs sysfs /sys
 57                                                    57 
 58                                                    58 
 59 創建目錄                                       59 創建目錄
 60 ~~~~~~~~                                           60 ~~~~~~~~
 61                                                    61 
 62 任何 kobject åœ¨ç³»çµ±ä¸­è¨»å†Šï¼Œå°±æœƒæœ‰ä     62 任何 kobject 在系統中註冊,就會有一個目錄在 sysfs 中被創建。這個
 63 目錄是作爲該 kobject 的父å°è±¡æ‰€åœ¨ç     63 目錄是作爲該 kobject 的父å°è±¡æ‰€åœ¨ç›®éŒ„çš„å­ç›®éŒ„創建的,以準確地傳éž
 64 內核的å°è±¡å±¤æ¬¡åˆ°ç”¨æˆ¶ç©ºé–“。sysfs ä !!  64 內核的å°è±¡å±¤æ¬¡åˆ°ç”¨æˆ¶ç©ºé–“。sysfs 中的頂層目錄代表著內核å°è±¡å±¤æ¬¡çš„
 65 å…±åŒç¥–先;例如:æŸäº›å°è±¡å±¬æ–¼æŸå     65 å…±åŒç¥–先;例如:æŸäº›å°è±¡å±¬æ–¼æŸå€‹å­ç³»çµ±ã€‚
 66                                                    66 
 67 Sysfs 在與其目錄關è¯çš„ kernfs_node å°     67 Sysfs 在與其目錄關è¯çš„ kernfs_node å°è±¡ä¸­å…§éƒ¨ä¿å­˜ä¸€å€‹æŒ‡å‘實ç¾
 68 目錄的 kobject 的指é‡ã€‚以å‰ï¼Œé€™å€‹      68 目錄的 kobject 的指é‡ã€‚以å‰ï¼Œé€™å€‹ kobject 指é‡è¢« sysfs 直接用於
 69 kobject 文件打開和關閉的引用計數〠    69 kobject 文件打開和關閉的引用計數。而ç¾åœ¨çš„ sysfs 實ç¾ä¸­ï¼Œkobject
 70 引用計數åªèƒ½é€šéŽ sysfs_schedule_callba     70 引用計數åªèƒ½é€šéŽ sysfs_schedule_callback() 函數直接修改。
 71                                                    71 
 72                                                    72 
 73 屬性                                             73 屬性
 74 ~~~~                                               74 ~~~~
 75                                                    75 
 76 kobject 的屬性å¯åœ¨æ–‡ä»¶ç³»çµ±ä¸­ä»¥æ™®é€     76 kobject 的屬性å¯åœ¨æ–‡ä»¶ç³»çµ±ä¸­ä»¥æ™®é€šæ–‡ä»¶çš„å½¢å¼å°Žå‡ºã€‚Sysfs 爲屬性定義
 77 了é¢å‘文件 I/O æ“作的方法,以æä¾     77 了é¢å‘文件 I/O æ“作的方法,以æä¾›å°å…§æ ¸å±¬æ€§çš„讀寫。
 78                                                    78 
 79                                                    79 
 80 屬性應爲 ASCII 碼文本文件。以一個     80 屬性應爲 ASCII 碼文本文件。以一個文件åªå­˜å„²ä¸€å€‹å±¬æ€§å€¼çˆ²å®œã€‚但一個
 81 文件åªåŒ…å«ä¸€å€‹å±¬æ€§å€¼å¯èƒ½å½±éŸ¿æ•ˆç     81 文件åªåŒ…å«ä¸€å€‹å±¬æ€§å€¼å¯èƒ½å½±éŸ¿æ•ˆçŽ‡ï¼Œæ‰€ä»¥ä¸€å€‹åŒ…å«ç›¸åŒæ•¸æ“šé¡žåž‹çš„屬性值
 82 數組也被廣泛地接å—。                     82 數組也被廣泛地接å—。
 83                                                    83 
 84 æ··åˆé¡žåž‹ã€è¡¨é”多行數據以åŠä¸€äº›æ     84 æ··åˆé¡žåž‹ã€è¡¨é”多行數據以åŠä¸€äº›æ€ªç•°çš„數據格å¼æœƒé­åˆ°å¼·çƒˆåå°ã€‚這樣åšæ˜¯
 85 很丟臉的,而且其代碼會在未通知作     85 很丟臉的,而且其代碼會在未通知作者的情æ³ä¸‹è¢«é‡å¯«ã€‚
 86                                                    86 
 87                                                    87 
 88 一個簡單的屬性çµæ§‹å®šç¾©å¦‚下:           88 一個簡單的屬性çµæ§‹å®šç¾©å¦‚下:
 89                                                    89 
 90 struct attribute {                                 90 struct attribute {
 91         char                    * name;            91         char                    * name;
 92         struct module           *owner;            92         struct module           *owner;
 93         umode_t                 mode;              93         umode_t                 mode;
 94 };                                                 94 };
 95                                                    95 
 96                                                    96 
 97 int sysfs_create_file(struct kobject * kobj, c     97 int sysfs_create_file(struct kobject * kobj, const struct attribute * attr);
 98 void sysfs_remove_file(struct kobject * kobj,      98 void sysfs_remove_file(struct kobject * kobj, const struct attribute * attr);
 99                                                    99 
100                                                   100 
101 一個單ç¨çš„屬性çµæ§‹ä¸¦ä¸åŒ…å«è®€å¯«å    101 一個單ç¨çš„屬性çµæ§‹ä¸¦ä¸åŒ…å«è®€å¯«å…¶å±¬æ€§å€¼çš„方法。å­ç³»çµ±æœ€å¥½çˆ²å¢žåˆªç‰¹å®š
102 å°è±¡é¡žåž‹çš„屬性定義自己的屬性çµæ    102 å°è±¡é¡žåž‹çš„屬性定義自己的屬性çµæ§‹é«”å’Œå°è£å‡½æ•¸ã€‚
103                                                   103 
104 例如:驅動程åºæ¨¡åž‹å®šç¾©çš„ device_attr    104 例如:驅動程åºæ¨¡åž‹å®šç¾©çš„ device_attribute çµæ§‹é«”如下:
105                                                   105 
106 struct device_attribute {                         106 struct device_attribute {
107         struct attribute        attr;             107         struct attribute        attr;
108         ssize_t (*show)(struct device *dev, st    108         ssize_t (*show)(struct device *dev, struct device_attribute *attr,
109                         char *buf);               109                         char *buf);
110         ssize_t (*store)(struct device *dev, s    110         ssize_t (*store)(struct device *dev, struct device_attribute *attr,
111                          const char *buf, size    111                          const char *buf, size_t count);
112 };                                                112 };
113                                                   113 
114 int device_create_file(struct device *, const     114 int device_create_file(struct device *, const struct device_attribute *);
115 void device_remove_file(struct device *, const    115 void device_remove_file(struct device *, const struct device_attribute *);
116                                                   116 
117 爲了定義設備屬性,åŒæ™‚å®šç¾©äº†ä¸€ä    117 爲了定義設備屬性,åŒæ™‚定義了一下輔助å®:
118                                                   118 
119 #define DEVICE_ATTR(_name, _mode, _show, _stor    119 #define DEVICE_ATTR(_name, _mode, _show, _store) \
120 struct device_attribute dev_attr_##_name = __A    120 struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)
121                                                   121 
122 例如:è²æ˜Ž                                     122 例如:è²æ˜Ž
123                                                   123 
124 static DEVICE_ATTR(foo, S_IWUSR | S_IRUGO, sho    124 static DEVICE_ATTR(foo, S_IWUSR | S_IRUGO, show_foo, store_foo);
125                                                   125 
126 ç­‰åŒæ–¼å¦‚下代碼:                          126 ç­‰åŒæ–¼å¦‚下代碼:
127                                                   127 
128 static struct device_attribute dev_attr_foo =     128 static struct device_attribute dev_attr_foo = {
129        .attr    = {                               129        .attr    = {
130                 .name = "foo",                    130                 .name = "foo",
131                 .mode = S_IWUSR | S_IRUGO,        131                 .mode = S_IWUSR | S_IRUGO,
132                 .show = show_foo,                 132                 .show = show_foo,
133                 .store = store_foo,               133                 .store = store_foo,
134         },                                        134         },
135 };                                                135 };
136                                                   136 
137                                                   137 
138 å­ç³»çµ±ç‰¹æœ‰çš„回調函數                    138 å­ç³»çµ±ç‰¹æœ‰çš„回調函數
139 ~~~~~~~~~~~~~~~~~~~                               139 ~~~~~~~~~~~~~~~~~~~
140                                                   140 
141 當一個å­ç³»çµ±å®šç¾©ä¸€å€‹æ–°çš„å±¬æ€§é¡žå    141 當一個å­ç³»çµ±å®šç¾©ä¸€å€‹æ–°çš„屬性類型時,必須實ç¾ä¸€ç³»åˆ—çš„ sysfs æ“作,
142 以幫助讀寫調用實ç¾å±¬æ€§æ‰€æœ‰è€…çš„é    142 以幫助讀寫調用實ç¾å±¬æ€§æ‰€æœ‰è€…的顯示和儲存方法。
143                                                   143 
144 struct sysfs_ops {                                144 struct sysfs_ops {
145         ssize_t (*show)(struct kobject *, stru    145         ssize_t (*show)(struct kobject *, struct attribute *, char *);
146         ssize_t (*store)(struct kobject *, str    146         ssize_t (*store)(struct kobject *, struct attribute *, const char *, size_t);
147 };                                                147 };
148                                                   148 
149 [å­ç³»çµ±æ‡‰å·²ç¶“定義了一個 struct kobj    149 [å­ç³»çµ±æ‡‰å·²ç¶“定義了一個 struct kobj_type çµæ§‹é«”作爲這個類型的
150 æ述符,並在此ä¿å­˜ sysfs_ops çš„æŒ‡é‡    150 æ述符,並在此ä¿å­˜ sysfs_ops 的指é‡ã€‚更多的信æ¯åƒè¦‹ kobject çš„
151 文檔]                                           151 文檔]
152                                                   152 
153 sysfs 會爲這個類型調用é©ç•¶çš„æ–¹æ³•ã    153 sysfs 會爲這個類型調用é©ç•¶çš„方法。當一個文件被讀寫時,這個方法會
154 將一般的kobject å’Œ attribute çµæ§‹é«”指    154 將一般的kobject å’Œ attribute çµæ§‹é«”指é‡è½‰æ›çˆ²é©ç•¶çš„指é‡é¡žåž‹å¾Œ
155 調用相關è¯çš„函數。                       155 調用相關è¯çš„函數。
156                                                   156 
157                                                   157 
158 示例:                                           158 示例:
159                                                   159 
160 #define to_dev_attr(_attr) container_of(_attr,    160 #define to_dev_attr(_attr) container_of(_attr, struct device_attribute, attr)
161                                                   161 
162 static ssize_t dev_attr_show(struct kobject *k    162 static ssize_t dev_attr_show(struct kobject *kobj, struct attribute *attr,
163                              char *buf)           163                              char *buf)
164 {                                                 164 {
165         struct device_attribute *dev_attr = to    165         struct device_attribute *dev_attr = to_dev_attr(attr);
166         struct device *dev = kobj_to_dev(kobj)    166         struct device *dev = kobj_to_dev(kobj);
167         ssize_t ret = -EIO;                       167         ssize_t ret = -EIO;
168                                                   168 
169         if (dev_attr->show)                       169         if (dev_attr->show)
170                 ret = dev_attr->show(dev, dev_    170                 ret = dev_attr->show(dev, dev_attr, buf);
171         if (ret >= (ssize_t)PAGE_SIZE) {          171         if (ret >= (ssize_t)PAGE_SIZE) {
172                 printk("dev_attr_show: %pS ret    172                 printk("dev_attr_show: %pS returned bad count\n",
173                                 dev_attr->show    173                                 dev_attr->show);
174         }                                         174         }
175         return ret;                               175         return ret;
176 }                                                 176 }
177                                                   177 
178                                                   178 
179                                                   179 
180 讀寫屬性數據                                180 讀寫屬性數據
181 ~~~~~~~~~~~~                                      181 ~~~~~~~~~~~~
182                                                   182 
183 在è²æ˜Žå±¬æ€§æ™‚,必須指定 show() 或 s    183 在è²æ˜Žå±¬æ€§æ™‚,必須指定 show() 或 store() 方法,以實ç¾å±¬æ€§çš„
184 è®€æˆ–å¯«ã€‚é€™äº›æ–¹æ³•çš„é¡žåž‹æ‡‰è©²å’Œä»¥ä    184 讀或寫。這些方法的類型應該和以下的設備屬性定義一樣簡單。
185                                                   185 
186 ssize_t (*show)(struct device *dev, struct dev    186 ssize_t (*show)(struct device *dev, struct device_attribute *attr, char *buf);
187 ssize_t (*store)(struct device *dev, struct de    187 ssize_t (*store)(struct device *dev, struct device_attribute *attr,
188                  const char *buf, size_t count    188                  const char *buf, size_t count);
189                                                   189 
190 也就是說,他們應åªä»¥ä¸€å€‹è™•ç†å°è±¡    190 也就是說,他們應åªä»¥ä¸€å€‹è™•ç†å°è±¡ã€ä¸€å€‹å±¬æ€§å’Œä¸€å€‹ç·©è¡æŒ‡é‡ä½œçˆ²åƒæ•¸ã€‚
191                                                   191 
192 sysfs 會分é…一個大å°çˆ² (PAGE_SIZE) çš„    192 sysfs 會分é…一個大å°çˆ² (PAGE_SIZE) çš„ç·©è¡å€ä¸¦å‚³éžçµ¦é€™å€‹æ–¹æ³•ã€‚
193 Sysfs 將會爲æ¯æ¬¡è®€å¯«æ“ä½œèª¿ç”¨ä¸€æ¬¡é    193 Sysfs 將會爲æ¯æ¬¡è®€å¯«æ“作調用一次這個方法。這使得這些方法在執行時
194 會出ç¾ä»¥ä¸‹çš„行爲:                         194 會出ç¾ä»¥ä¸‹çš„行爲:
195                                                   195 
196 - 在讀方é¢ï¼ˆread(2)),show() 方法應    196 - 在讀方é¢ï¼ˆread(2)),show() 方法應該填充整個緩è¡å€ã€‚回想屬性
197   應åªå°Žå‡ºäº†ä¸€å€‹å±¬æ€§å€¼æˆ–æ˜¯ä¸€å€‹å    197   應åªå°Žå‡ºäº†ä¸€å€‹å±¬æ€§å€¼æˆ–是一個åŒé¡žåž‹å±¬æ€§å€¼çš„數組,所以這個代價將
198   ä¸æœƒä¸å¤ªé«˜ã€‚                              198   ä¸æœƒä¸å¤ªé«˜ã€‚
199                                                   199 
200   這使得用戶空間å¯ä»¥å±€éƒ¨åœ°è®€å’Œä»    200   這使得用戶空間å¯ä»¥å±€éƒ¨åœ°è®€å’Œä»»æ„çš„å‘å‰æœç´¢æ•´å€‹æ–‡ä»¶ã€‚如果用戶空間
201   å‘後æœç´¢åˆ°é›¶æˆ–使用‘0’å移執è !! 201   å‘後æœç´¢åˆ°é›¶æˆ–使用『0ã€å移執行一個pread(2)æ“作,show()方法將
202   å†æ¬¡è¢«èª¿ç”¨ï¼Œä»¥é‡æ–°å¡«å……緩存。      202   å†æ¬¡è¢«èª¿ç”¨ï¼Œä»¥é‡æ–°å¡«å……緩存。
203                                                   203 
204 - 在寫方é¢ï¼ˆwrite(2)),sysfs 希望在    204 - 在寫方é¢ï¼ˆwrite(2)),sysfs 希望在第一次寫æ“作時得到整個緩è¡å€ã€‚
205   之後 Sysfs 傳éžæ•´å€‹ç·©è¡å€çµ¦ store(    205   之後 Sysfs 傳éžæ•´å€‹ç·©è¡å€çµ¦ store() 方法。
206                                                   206 
207   當è¦å¯« sysfs æ–‡ä»¶æ™‚ï¼Œç”¨æˆ¶ç©ºé–“é€²ç    207   當è¦å¯« sysfs 文件時,用戶空間進程應首先讀å–整個文件,修該想è¦
208   改變的值,然後回寫整個緩è¡å€ã€    208   改變的值,然後回寫整個緩è¡å€ã€‚
209                                                   209 
210   åœ¨è®€å¯«å±¬æ€§å€¼æ™‚ï¼Œå±¬æ€§æ–¹æ³•çš„åŸ·è¡    210   在讀寫屬性值時,屬性方法的執行應æ“作相åŒçš„ç·©è¡å€ã€‚
211                                                   211 
212 註記:                                           212 註記:
213                                                   213 
214 - 寫æ“作導致的 show() 方法é‡è¼‰ï¼Œæœƒ    214 - 寫æ“作導致的 show() 方法é‡è¼‰ï¼Œæœƒå¿½ç•¥ç•¶å‰æ–‡ä»¶ä½ç½®ã€‚
215                                                   215 
216 - ç·©è¡å€æ‡‰ç¸½æ˜¯ PAGE_SIZE 大å°ã€‚å°æ–¼    216 - ç·©è¡å€æ‡‰ç¸½æ˜¯ PAGE_SIZE 大å°ã€‚å°æ–¼i386,這個值爲4096。
217                                                   217 
218 - show() 方法應該返回寫入緩è¡å€çš„å    218 - show() 方法應該返回寫入緩è¡å€çš„字節數,也就是 scnprintf()çš„
219   返回值。                                    219   返回值。
220                                                   220 
221 - show() 方法在將格å¼åŒ–è¿”å›žå€¼è¿”å›žç    221 - show() 方法在將格å¼åŒ–返回值返回用戶空間的時候,ç¦æ­¢ä½¿ç”¨snprintf()。
222   如果å¯ä»¥ä¿è­‰ä¸æœƒç™¼ç”Ÿç·©è¡å€æº¢å‡    222   如果å¯ä»¥ä¿è­‰ä¸æœƒç™¼ç”Ÿç·©è¡å€æº¢å‡ºï¼Œå¯ä»¥ä½¿ç”¨sprintf(),å¦å‰‡å¿…須使用
223   scnprintf()。                                  223   scnprintf()。
224                                                   224 
225 - store() 應返回緩è¡å€çš„已用字節數    225 - store() 應返回緩è¡å€çš„已用字節數。如果整個緩存都已填滿,åªéœ€è¿”回
226   count åƒæ•¸ã€‚                                 226   count åƒæ•¸ã€‚
227                                                   227 
228 - show() 或 store() å¯ä»¥è¿”å›žéŒ¯èª¤å€¼ã€‚ç    228 - show() 或 store() å¯ä»¥è¿”回錯誤值。當得到一個éžæ³•å€¼ï¼Œå¿…須返回一個
229   錯誤值。                                    229   錯誤值。
230                                                   230 
231 - 一個傳éžçµ¦æ–¹æ³•çš„å°è±¡å°‡æœƒé€šéŽ s    231 - 一個傳éžçµ¦æ–¹æ³•çš„å°è±¡å°‡æœƒé€šéŽ sysfs 調用å°è±¡å…§åµŒçš„引用計數固定在
232   內存中。儘管如此,å°è±¡ä»£è¡¨çš„ç‰    232   內存中。儘管如此,å°è±¡ä»£è¡¨çš„物ç†å¯¦é«”(如設備)å¯èƒ½å·²ä¸å­˜åœ¨ã€‚如有必è¦ï¼Œ
233   應該實ç¾ä¸€å€‹æª¢æ¸¬æ©Ÿåˆ¶ã€‚               233   應該實ç¾ä¸€å€‹æª¢æ¸¬æ©Ÿåˆ¶ã€‚
234                                                   234 
235 一個簡單的(未經實驗證實的)è¨­å‚™å±    235 一個簡單的(未經實驗證實的)設備屬性實ç¾å¦‚下:
236                                                   236 
237 static ssize_t show_name(struct device *dev, s    237 static ssize_t show_name(struct device *dev, struct device_attribute *attr,
238                          char *buf)               238                          char *buf)
239 {                                                 239 {
240         return scnprintf(buf, PAGE_SIZE, "%s\n    240         return scnprintf(buf, PAGE_SIZE, "%s\n", dev->name);
241 }                                                 241 }
242                                                   242 
243 static ssize_t store_name(struct device *dev,     243 static ssize_t store_name(struct device *dev, struct device_attribute *attr,
244                           const char *buf, siz    244                           const char *buf, size_t count)
245 {                                                 245 {
246         snprintf(dev->name, sizeof(dev->name),    246         snprintf(dev->name, sizeof(dev->name), "%.*s",
247                  (int)min(count, sizeof(dev->n    247                  (int)min(count, sizeof(dev->name) - 1), buf);
248         return count;                             248         return count;
249 }                                                 249 }
250                                                   250 
251 static DEVICE_ATTR(name, S_IRUGO, show_name, s    251 static DEVICE_ATTR(name, S_IRUGO, show_name, store_name);
252                                                   252 
253                                                   253 
254 (注æ„:真正的實ç¾ä¸å…è¨±ç”¨æˆ¶ç©ºé    254 (注æ„:真正的實ç¾ä¸å…許用戶空間設置設備å。)
255                                                   255 
256 頂層目錄佈局                             !! 256 頂層目錄布局
257 ~~~~~~~~~~~~                                      257 ~~~~~~~~~~~~
258                                                   258 
259 sysfs 目錄的安排顯示了內核數據çµæ    259 sysfs 目錄的安排顯示了內核數據çµæ§‹ä¹‹é–“的關係。
260                                                   260 
261 頂層 sysfs 目錄如下:                        261 頂層 sysfs 目錄如下:
262                                                   262 
263 block/                                            263 block/
264 bus/                                              264 bus/
265 class/                                            265 class/
266 dev/                                              266 dev/
267 devices/                                          267 devices/
268 firmware/                                         268 firmware/
269 net/                                              269 net/
270 fs/                                               270 fs/
271                                                   271 
272 devices/ 包å«äº†ä¸€å€‹è¨­å‚™æ¨¹çš„æ–‡ä»¶ç³»ç    272 devices/ 包å«äº†ä¸€å€‹è¨­å‚™æ¨¹çš„文件系統表示。他直接映射了內部的內核
273 設備樹,å映了設備的層次çµæ§‹ã€‚     273 設備樹,å映了設備的層次çµæ§‹ã€‚
274                                                   274 
275 bus/ 包å«äº†å…§æ ¸ä¸­å„ç¨®ç¸½ç·šé¡žåž‹çš„å¹ !! 275 bus/ 包å«äº†å…§æ ¸ä¸­å„種總線類型的平é¢ç›®éŒ„布局。æ¯å€‹ç¸½ç·šç›®éŒ„包å«å…©å€‹
276 å­ç›®éŒ„:                                        276 å­ç›®éŒ„:
277                                                   277 
278         devices/                                  278         devices/
279         drivers/                                  279         drivers/
280                                                   280 
281 devices/ 包å«äº†ç³»çµ±ä¸­å‡ºç¾çš„æ¯å€‹è¨­å !! 281 devices/ 包å«äº†ç³»çµ±ä¸­å‡ºç¾çš„æ¯å€‹è¨­å‚™çš„符號連çµï¼Œä»–å€‘æŒ‡å‘ root/ 下的
282 設備目錄。                                   282 設備目錄。
283                                                   283 
284 drivers/ 包å«äº†æ¯å€‹å·²çˆ²ç‰¹å®šç¸½ç·šä¸Šç !! 284 drivers/ 包å«äº†æ¯å€‹å·²çˆ²ç‰¹å®šç¸½ç·šä¸Šçš„設備而掛載的驅動程åºçš„目錄(這裡
285 å‡å®šé©…動沒有跨越多個總線類型)。    285 å‡å®šé©…動沒有跨越多個總線類型)。
286                                                   286 
287 fs/ 包å«äº†ä¸€å€‹çˆ²æ–‡ä»¶ç³»çµ±è¨­ç«‹çš„ç›®    287 fs/ 包å«äº†ä¸€å€‹çˆ²æ–‡ä»¶ç³»çµ±è¨­ç«‹çš„目錄。ç¾åœ¨æ¯å€‹æƒ³è¦å°Žå‡ºå±¬æ€§çš„文件系統必須
288 在 fs/ 下創建自己的層次çµæ§‹(åƒè¦‹D    288 在 fs/ 下創建自己的層次çµæ§‹(åƒè¦‹Documentation/filesystems/fuse.rst)。
289                                                   289 
290 dev/ 包å«å…©å€‹å­ç›®éŒ„: char/ å’Œ block/    290 dev/ 包å«å…©å€‹å­ç›®éŒ„: char/ å’Œ block/。在這兩個å­ç›®éŒ„中,有以
291 <major>:<minor> æ ¼å¼å‘½å的符號éˆæŽ¥ã€‚ !! 291 <major>:<minor> æ ¼å¼å‘½å的符號連çµã€‚這些符號連çµæŒ‡å‘ sysfs 目錄
292 中相應的設備。/sys/dev æä¾›ä¸€å€‹é€šé    292 中相應的設備。/sys/dev æ供一個通éŽä¸€å€‹ stat(2) æ“作çµæžœï¼ŒæŸ¥æ‰¾
293 設備 sysfs 接å£å¿«æ·çš„方法。             293 設備 sysfs 接å£å¿«æ·çš„方法。
294                                                   294 
295 更多有關 driver-model 的特性信æ¯å¯ä»    295 更多有關 driver-model 的特性信æ¯å¯ä»¥åœ¨ Documentation/driver-api/driver-model/
296 中找到。                                      296 中找到。
297                                                   297 
298                                                   298 
299 TODO: 完æˆé€™ä¸€ç¯€ã€‚                          299 TODO: 完æˆé€™ä¸€ç¯€ã€‚
300                                                   300 
301                                                   301 
302 當å‰æŽ¥å£                                      302 當å‰æŽ¥å£
303 ~~~~~~~~                                          303 ~~~~~~~~
304                                                   304 
305 以下的接å£å±¤æ™®é存在於當å‰çš„sysf    305 以下的接å£å±¤æ™®é存在於當å‰çš„sysfs中:
306                                                   306 
307 - 設備 (include/linux/device.h)                 307 - 設備 (include/linux/device.h)
308 ----------------------------------                308 ----------------------------------
309 çµæ§‹é«”:                                        309 çµæ§‹é«”:
310                                                   310 
311 struct device_attribute {                         311 struct device_attribute {
312         struct attribute        attr;             312         struct attribute        attr;
313         ssize_t (*show)(struct device *dev, st    313         ssize_t (*show)(struct device *dev, struct device_attribute *attr,
314                         char *buf);               314                         char *buf);
315         ssize_t (*store)(struct device *dev, s    315         ssize_t (*store)(struct device *dev, struct device_attribute *attr,
316                          const char *buf, size    316                          const char *buf, size_t count);
317 };                                                317 };
318                                                   318 
319 è²æ˜Ž:                                           319 è²æ˜Ž:
320                                                   320 
321 DEVICE_ATTR(_name, _mode, _show, _store);         321 DEVICE_ATTR(_name, _mode, _show, _store);
322                                                   322 
323 增/刪屬性:                                    323 增/刪屬性:
324                                                   324 
325 int device_create_file(struct device *dev, con    325 int device_create_file(struct device *dev, const struct device_attribute * attr);
326 void device_remove_file(struct device *dev, co    326 void device_remove_file(struct device *dev, const struct device_attribute * attr);
327                                                   327 
328                                                   328 
329 - ç¸½ç·šé©…å‹•ç¨‹åº (include/linux/device.h)     329 - ç¸½ç·šé©…å‹•ç¨‹åº (include/linux/device.h)
330 --------------------------------------            330 --------------------------------------
331 çµæ§‹é«”:                                        331 çµæ§‹é«”:
332                                                   332 
333 struct bus_attribute {                            333 struct bus_attribute {
334         struct attribute        attr;             334         struct attribute        attr;
335         ssize_t (*show)(const struct bus_type  !! 335         ssize_t (*show)(struct bus_type *, char * buf);
336         ssize_t (*store)(const struct bus_type !! 336         ssize_t (*store)(struct bus_type *, const char * buf, size_t count);
337 };                                                337 };
338                                                   338 
339 è²æ˜Ž:                                           339 è²æ˜Ž:
340                                                   340 
341 BUS_ATTR(_name, _mode, _show, _store)             341 BUS_ATTR(_name, _mode, _show, _store)
342                                                   342 
343 增/刪屬性:                                    343 增/刪屬性:
344                                                   344 
345 int bus_create_file(struct bus_type *, struct     345 int bus_create_file(struct bus_type *, struct bus_attribute *);
346 void bus_remove_file(struct bus_type *, struct    346 void bus_remove_file(struct bus_type *, struct bus_attribute *);
347                                                   347 
348                                                   348 
349 - è¨­å‚™é©…å‹•ç¨‹åº (include/linux/device.h)     349 - è¨­å‚™é©…å‹•ç¨‹åº (include/linux/device.h)
350 -----------------------------------------         350 -----------------------------------------
351                                                   351 
352 çµæ§‹é«”:                                        352 çµæ§‹é«”:
353                                                   353 
354 struct driver_attribute {                         354 struct driver_attribute {
355         struct attribute        attr;             355         struct attribute        attr;
356         ssize_t (*show)(struct device_driver *    356         ssize_t (*show)(struct device_driver *, char * buf);
357         ssize_t (*store)(struct device_driver     357         ssize_t (*store)(struct device_driver *, const char * buf,
358                          size_t count);           358                          size_t count);
359 };                                                359 };
360                                                   360 
361 è²æ˜Ž:                                           361 è²æ˜Ž:
362                                                   362 
363 DRIVER_ATTR(_name, _mode, _show, _store)          363 DRIVER_ATTR(_name, _mode, _show, _store)
364                                                   364 
365 增/刪屬性:                                  365 增/刪屬性:
366                                                   366 
367 int driver_create_file(struct device_driver *,    367 int driver_create_file(struct device_driver *, const struct driver_attribute *);
368 void driver_remove_file(struct device_driver *    368 void driver_remove_file(struct device_driver *, const struct driver_attribute *);
369                                                   369 
370                                                   370 
371 文檔                                            371 文檔
372 ~~~~                                              372 ~~~~
373                                                   373 
374 sysfs 目錄çµæ§‹ä»¥åŠå…¶ä¸­åŒ…å«çš„å±¬æ€§å    374 sysfs 目錄çµæ§‹ä»¥åŠå…¶ä¸­åŒ…å«çš„屬性定義了一個內核與用戶空間之間的 ABI。
375 å°æ–¼ä»»ä½• ABI,其自身的穩定和é©ç•¶    375 å°æ–¼ä»»ä½• ABI,其自身的穩定和é©ç•¶çš„文檔是éžå¸¸é‡è¦çš„。所有新的 sysfs
376 屬性必須在 Documentation/ABI 中有文檔    376 屬性必須在 Documentation/ABI 中有文檔。詳見 Documentation/ABI/README。
377                                                   377 
                                                      

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php