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 <2023002089@link.tyut.edu.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)(const struct bus_type *, char * buf); 336 ssize_t (*store)(const struct bus_type 336 ssize_t (*store)(const 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
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.