Based on kernel version 3.9. Page generated on 2013-05-02 23:17 EST.
1 Chinese translated version of Documentation/filesystems/sysfs.txt 2 3 If you have any comment or update to the content, please contact the 4 original document maintainer directly. However, if you have a problem 5 communicating in English you can also ask the Chinese maintainer for 6 help. Contact the Chinese maintainer if this translation is outdated 7 or if there is a problem with the translation. 8 9 Maintainer: Patrick Mochel <mochel@osdl.org> 10 Mike Murphy <mamurph@cs.clemson.edu> 11 Chinese maintainer: Fu Wei <tekkamanninja@gmail.com> 12 --------------------------------------------------------------------- 13 Documentation/filesystems/sysfs.txt çä¸æç¿»è¯ 14 15 妿æ³è¯è®ºææ´æ°æ¬æçå 容ï¼è¯·ç´æ¥èç³»åææ¡£çç»´æ¤è ãå¦æä½ ä½¿ç¨è±æ 16 äº¤æµæå°é¾çè¯ï¼ä¹å¯ä»¥å䏿çç»´æ¤è æ±å©ã妿æ¬ç¿»è¯æ´æ°ä¸åæ¶æè ç¿» 17 è¯åå¨é®é¢ï¼è¯·èç³»ä¸æçç»´æ¤è ã 18 è±æçç»´æ¤è ï¼ Patrick Mochel <mochel@osdl.org> 19 Mike Murphy <mamurph@cs.clemson.edu> 20 䏿çç»´æ¤è ï¼ å ç Fu Wei <tekkamanninja@gmail.com> 21 䏿çç¿»è¯è ï¼ å ç Fu Wei <tekkamanninja@gmail.com> 22 ä¸æçæ ¡è¯è ï¼ å ç Fu Wei <tekkamanninja@gmail.com> 23 24 25 以ä¸ä¸ºæ£æ 26 --------------------------------------------------------------------- 27 sysfs - ç¨äºå¯¼åºå æ ¸å¯¹è±¡(kobject)çæä»¶ç³»ç» 28 29 Patrick Mochel <mochel@osdl.org> 30 Mike Murphy <mamurph@cs.clemson.edu> 31 32 修订: 16 August 2011 33 åå§çæ¬: 10 January 2003 34 35 36 sysfs ç®ä»: 37 ~~~~~~~~~~ 38 39 sysfs æ¯ä¸ä¸ªæååºäº ramfs ä¸ä½äºå åçæä»¶ç³»ç»ã宿ä¾å¯¼åºå æ ¸ 40 æ°æ®ç»æåå ¶å±æ§ï¼ä»¥åå®ä»¬ä¹é´çå ³èå°ç¨æ·ç©ºé´çæ¹æ³ã 41 42 sysfs å§ç»ä¸ kobject çåºå±ç»æç´§å¯ç¸å ³ã请é 读 43 Documentation/kobject.txt ææ¡£ä»¥è·å¾æ´å¤å ³äº kobject æ¥å£ç 44 ä¿¡æ¯ã 45 46 47 ä½¿ç¨ sysfs 48 ~~~~~~~~~~~ 49 50 åªè¦å æ ¸é ç½®ä¸å®ä¹äº CONFIG_SYSFS ï¼sysfs æ»æ¯è¢«ç¼è¯è¿å æ ¸ãä½ å¯ 51 éè¿ä»¥ä¸å½ä»¤æè½½å®: 52 53 mount -t sysfs sysfs /sys 54 55 56 å建ç®å½ 57 ~~~~~~~~ 58 59 ä»»ä½ kobject å¨ç³»ç»ä¸æ³¨åï¼å°±ä¼æä¸ä¸ªç®å½å¨ sysfs ä¸è¢«å建ãè¿ä¸ª 60 ç®å½æ¯ä½ä¸ºè¯¥ kobject çç¶å¯¹è±¡æå¨ç®å½çåç®å½å建çï¼ä»¥åç¡®å°ä¼ é 61 å æ ¸çå¯¹è±¡å±æ¬¡å°ç¨æ·ç©ºé´ãsysfs ä¸çé¡¶å±ç®å½ä»£è¡¨çå æ ¸å¯¹è±¡å±æ¬¡ç 62 å ±åç¥å ï¼ä¾å¦ï¼æäºå¯¹è±¡å±äºæä¸ªåç³»ç»ã 63 64 Sysfs å¨ä¸å ¶ç®å½å ³èç sysfs_dirent 对象ä¸å é¨ä¿åä¸ä¸ªæåå®ç° 65 ç®å½ç kobject çæéã以åï¼è¿ä¸ª kobject æé被 sysfs ç´æ¥ç¨äº 66 kobject æä»¶æå¼åå ³éçå¼ç¨è®¡æ°ãèç°å¨ç sysfs å®ç°ä¸ï¼kobject 67 å¼ç¨è®¡æ°åªè½éè¿ sysfs_schedule_callback() 彿°ç´æ¥ä¿®æ¹ã 68 69 70 屿§ 71 ~~~~ 72 73 kobject ç屿§å¯å¨æä»¶ç³»ç»ä¸ä»¥æ®éæä»¶çå½¢å¼å¯¼åºãSysfs ä¸ºå±æ§å®ä¹ 74 äºé¢åæä»¶ I/O æä½çæ¹æ³ï¼ä»¥æä¾å¯¹å æ ¸å±æ§ç读åã 75 76 77 屿§åºä¸º ASCII ç ææ¬æä»¶ã以ä¸ä¸ªæä»¶åªåå¨ä¸ä¸ªå±æ§å¼ä¸ºå®ãä½ä¸ä¸ª 78 æä»¶åªå å«ä¸ä¸ªå±æ§å¼å¯è½å½±åæçï¼æä»¥ä¸ä¸ªå å«ç¸åæ°æ®ç±»åç屿§å¼ 79 æ°ç»ä¹è¢«å¹¿æ³å°æ¥åã 80 81 æ··åç±»åã表达å¤è¡æ°æ®ä»¥åä¸äºæªå¼çæ°æ®æ ¼å¼ä¼éå°å¼ºçå对ãè¿æ ·åæ¯ 82 å¾ä¸¢è¸ç,èä¸å ¶ä»£ç ä¼å¨æªéç¥ä½è çæ åµä¸è¢«éåã 83 84 85 ä¸ä¸ªç®åç屿§ç»æå®ä¹å¦ä¸: 86 87 struct attribute { 88 char * name; 89 struct module *owner; 90 umode_t mode; 91 }; 92 93 94 int sysfs_create_file(struct kobject * kobj, const struct attribute * attr); 95 void sysfs_remove_file(struct kobject * kobj, const struct attribute * attr); 96 97 98 ä¸ä¸ªåç¬ç屿§ç»æå¹¶ä¸å å«è¯»åå ¶å±æ§å¼çæ¹æ³ãåç³»ç»æå¥½ä¸ºå¢å ç¹å® 99 对象类åç屿§å®ä¹èªå·±ç屿§ç»æä½åå°è£ 彿°ã 100 101 ä¾å¦:驱å¨ç¨åºæ¨¡åå®ä¹ç device_attribute ç»æä½å¦ä¸: 102 103 struct device_attribute { 104 struct attribute attr; 105 ssize_t (*show)(struct device *dev, struct device_attribute *attr, 106 char *buf); 107 ssize_t (*store)(struct device *dev, struct device_attribute *attr, 108 const char *buf, size_t count); 109 }; 110 111 int device_create_file(struct device *, const struct device_attribute *); 112 void device_remove_file(struct device *, const struct device_attribute *); 113 114 为äºå®ä¹è®¾å¤å±æ§ï¼åæ¶å®ä¹äºä¸ä¸è¾ å©å®: 115 116 #define DEVICE_ATTR(_name, _mode, _show, _store) \ 117 struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store) 118 119 ä¾å¦:声æ 120 121 static DEVICE_ATTR(foo, S_IWUSR | S_IRUGO, show_foo, store_foo); 122 123 çåäºå¦ä¸ä»£ç ï¼ 124 125 static struct device_attribute dev_attr_foo = { 126 .attr = { 127 .name = "foo", 128 .mode = S_IWUSR | S_IRUGO, 129 .show = show_foo, 130 .store = store_foo, 131 }, 132 }; 133 134 135 åç³»ç»ç¹æçåè°å½æ° 136 ~~~~~~~~~~~~~~~~~~~ 137 138 å½ä¸ä¸ªåç³»ç»å®ä¹ä¸ä¸ªæ°ç屿§ç±»åæ¶ï¼å¿ é¡»å®ç°ä¸ç³»åç sysfs æä½ï¼ 139 以帮å©è¯»åè°ç¨å®ç°å±æ§ææè çæ¾ç¤ºåå¨åæ¹æ³ã 140 141 struct sysfs_ops { 142 ssize_t (*show)(struct kobject *, struct attribute *, char *); 143 ssize_t (*store)(struct kobject *, struct attribute *, const char *, size_t); 144 }; 145 146 [åç³»ç»åºå·²ç»å®ä¹äºä¸ä¸ª struct kobj_type ç»æä½ä½ä¸ºè¿ä¸ªç±»åç 147 æè¿°ç¬¦ï¼å¹¶å¨æ¤ä¿å sysfs_ops çæéãæ´å¤çä¿¡æ¯åè§ kobject ç 148 ææ¡£] 149 150 sysfs ä¼ä¸ºè¿ä¸ªç±»åè°ç¨éå½çæ¹æ³ãå½ä¸ä¸ªæä»¶è¢«è¯»åæ¶ï¼è¿ä¸ªæ¹æ³ä¼ 151 å°ä¸è¬çkobject å attribute ç»æä½æé转æ¢ä¸ºéå½çæéç±»åå 152 è°ç¨ç¸å ³èç彿°ã 153 154 155 示ä¾: 156 157 #define to_dev(obj) container_of(obj, struct device, kobj) 158 #define to_dev_attr(_attr) container_of(_attr, struct device_attribute, attr) 159 160 static ssize_t dev_attr_show(struct kobject *kobj, struct attribute *attr, 161 char *buf) 162 { 163 struct device_attribute *dev_attr = to_dev_attr(attr); 164 struct device *dev = to_dev(kobj); 165 ssize_t ret = -EIO; 166 167 if (dev_attr->show) 168 ret = dev_attr->show(dev, dev_attr, buf); 169 if (ret >= (ssize_t)PAGE_SIZE) { 170 print_symbol("dev_attr_show: %s returned bad count\n", 171 (unsigned long)dev_attr->show); 172 } 173 return ret; 174 } 175 176 177 178 读å屿§æ°æ® 179 ~~~~~~~~~~~~ 180 181 å¨å£°æå±æ§æ¶ï¼å¿ é¡»æå® show() æ store() æ¹æ³ï¼ä»¥å®ç°å±æ§ç 182 读æåãè¿äºæ¹æ³çç±»ååºè¯¥å以ä¸ç设å¤å±æ§å®ä¹ä¸æ ·ç®åã 183 184 ssize_t (*show)(struct device *dev, struct device_attribute *attr, char *buf); 185 ssize_t (*store)(struct device *dev, struct device_attribute *attr, 186 const char *buf, size_t count); 187 188 ä¹å°±æ¯è¯´,ä»ä»¬åºåªä»¥ä¸ä¸ªå¤ç对象ãä¸ä¸ªå±æ§åä¸ä¸ªç¼å²æéä½ä¸ºåæ°ã 189 190 sysfs ä¼åé ä¸ä¸ªå¤§å°ä¸º (PAGE_SIZE) çç¼å²åºå¹¶ä¼ éç»è¿ä¸ªæ¹æ³ã 191 Sysfs å°ä¼ä¸ºæ¯æ¬¡è¯»åæä½è°ç¨ä¸æ¬¡è¿ä¸ªæ¹æ³ãè¿ä½¿å¾è¿äºæ¹æ³å¨æ§è¡æ¶ 192 ä¼åºç°ä»¥ä¸çè¡ä¸º: 193 194 - å¨è¯»æ¹é¢ï¼read(2)ï¼ï¼show() æ¹æ³åºè¯¥å¡«å æ´ä¸ªç¼å²åºã忳屿§ 195 åºåªå¯¼åºäºä¸ä¸ªå±æ§å¼ææ¯ä¸ä¸ªåç±»å屿§å¼çæ°ç»ï¼æä»¥è¿ä¸ªä»£ä»·å° 196 ä¸ä¼ä¸å¤ªé«ã 197 198 è¿ä½¿å¾ç¨æ·ç©ºé´å¯ä»¥å±é¨å°è¯»åä»»æçååæç´¢æ´ä¸ªæä»¶ãå¦æç¨æ·ç©ºé´ 199 ååæç´¢å°é¶æä½¿ç¨â0âåç§»æ§è¡ä¸ä¸ªpread(2)æä½ï¼show()æ¹æ³å° 200 忬¡è¢«è°ç¨ï¼ä»¥éæ°å¡«å ç¼åã 201 202 - å¨åæ¹é¢ï¼write(2)ï¼ï¼sysfs 叿å¨ç¬¬ä¸æ¬¡åæä½æ¶å¾å°æ´ä¸ªç¼å²åºã 203 ä¹å Sysfs ä¼ éæ´ä¸ªç¼å²åºç» store() æ¹æ³ã 204 205 å½è¦å sysfs æä»¶æ¶ï¼ç¨æ·ç©ºé´è¿ç¨åºé¦å è¯»åæ´ä¸ªæä»¶ï¼ä¿®è¯¥æ³è¦ 206 æ¹åçå¼ï¼ç¶åååæ´ä¸ªç¼å²åºã 207 208 å¨è¯»å屿§å¼æ¶ï¼å±æ§æ¹æ³çæ§è¡åºæä½ç¸åçç¼å²åºã 209 210 注记: 211 212 - åæä½å¯¼è´ç show() æ¹æ³éè½½ï¼ä¼å¿½ç¥å½åæä»¶ä½ç½®ã 213 214 - ç¼å²åºåºæ»æ¯ PAGE_SIZE 大å°ã对äºi386ï¼è¿ä¸ªå¼ä¸º4096ã 215 216 - show() æ¹æ³åºè¯¥è¿ååå ¥ç¼å²åºçåèæ°ï¼ä¹å°±æ¯ snprintf()ç 217 è¿åå¼ã 218 219 - show() åºå§ç»ä½¿ç¨ snprintf()ã 220 221 - store() åºè¿åç¼å²åºçå·²ç¨åèæ°ã妿æ´ä¸ªç¼åé½å·²å¡«æ»¡ï¼åªéè¿å 222 count åæ°ã 223 224 - show() æ store() å¯ä»¥è¿åé误å¼ãå½å¾å°ä¸ä¸ªéæ³å¼ï¼å¿ é¡»è¿åä¸ä¸ª 225 é误å¼ã 226 227 - ä¸ä¸ªä¼ éç»æ¹æ³ç对象å°ä¼éè¿ sysfs è°ç¨å¯¹è±¡å åµçå¼ç¨è®¡æ°åºå®å¨ 228 å åä¸ãå°½ç®¡å¦æ¤ï¼å¯¹è±¡ä»£è¡¨çç©çå®ä½(å¦è®¾å¤)å¯è½å·²ä¸åå¨ãå¦æå¿ è¦ï¼ 229 åºè¯¥å®ç°ä¸ä¸ªæ£æµæºå¶ã 230 231 ä¸ä¸ªç®åç(æªç»å®éªè¯å®ç)设å¤å±æ§å®ç°å¦ä¸ï¼ 232 233 static ssize_t show_name(struct device *dev, struct device_attribute *attr, 234 char *buf) 235 { 236 return scnprintf(buf, PAGE_SIZE, "%s\n", dev->name); 237 } 238 239 static ssize_t store_name(struct device *dev, struct device_attribute *attr, 240 const char *buf, size_t count) 241 { 242 snprintf(dev->name, sizeof(dev->name), "%.*s", 243 (int)min(count, sizeof(dev->name) - 1), buf); 244 return count; 245 } 246 247 static DEVICE_ATTR(name, S_IRUGO, show_name, store_name); 248 249 250 ï¼æ³¨æï¼çæ£çå®ç°ä¸å è®¸ç¨æ·ç©ºé´è®¾ç½®è®¾å¤åãï¼ 251 252 é¡¶å±ç®å½å¸å± 253 ~~~~~~~~~~~~ 254 255 sysfs ç®å½ç宿æ¾ç¤ºäºå æ ¸æ°æ®ç»æä¹é´çå ³ç³»ã 256 257 é¡¶å± sysfs ç®å½å¦ä¸: 258 259 block/ 260 bus/ 261 class/ 262 dev/ 263 devices/ 264 firmware/ 265 net/ 266 fs/ 267 268 devices/ å å«äºä¸ä¸ªè®¾å¤æ çæä»¶ç³»ç»è¡¨ç¤ºãä»ç´æ¥æ å°äºå é¨çå æ ¸ 269 è®¾å¤æ ï¼åæ äºè®¾å¤ç屿¬¡ç»æã 270 271 bus/ å å«äºå æ ¸ä¸åç§æ»çº¿ç±»åçå¹³é¢ç®å½å¸å±ãæ¯ä¸ªæ»çº¿ç®å½å å«ä¸¤ä¸ª 272 åç®å½: 273 274 devices/ 275 drivers/ 276 277 devices/ å å«äºç³»ç»ä¸åºç°çæ¯ä¸ªè®¾å¤ç符å·é¾æ¥ï¼ä»ä»¬æå root/ ä¸ç 278 设å¤ç®å½ã 279 280 drivers/ å å«äºæ¯ä¸ªå·²ä¸ºç¹å®æ»çº¿ä¸ç设å¤èæè½½ç驱å¨ç¨åºçç®å½(è¿é 281 åå®é©±å¨æ²¡æè·¨è¶å¤ä¸ªæ»çº¿ç±»å)ã 282 283 fs/ å å«äºä¸ä¸ªä¸ºæä»¶ç³»ç»è®¾ç«çç®å½ãç°å¨æ¯ä¸ªæ³è¦å¯¼åºå±æ§çæä»¶ç³»ç»å¿ é¡» 284 å¨ fs/ ä¸å建èªå·±ç屿¬¡ç»æ(åè§Documentation/filesystems/fuse.txt)ã 285 286 dev/ å å«ä¸¤ä¸ªåç®å½ï¼ char/ å block/ãå¨è¿ä¸¤ä¸ªåç®å½ä¸ï¼æä»¥ 287 <major>:<minor> æ ¼å¼å½åç符å·é¾æ¥ãè¿äºç¬¦å·é¾æ¥æå sysfs ç®å½ 288 ä¸ç¸åºç设å¤ã/sys/dev æä¾ä¸ä¸ªéè¿ä¸ä¸ª stat(2) æä½ç»æï¼æ¥æ¾ 289 è®¾å¤ sysfs æ¥å£å¿«æ·çæ¹æ³ã 290 291 æ´å¤æå ³ driver-model çç¹æ§ä¿¡æ¯å¯ä»¥å¨ Documentation/driver-model/ 292 䏿¾å°ã 293 294 295 TODO: 宿è¿ä¸èã 296 297 298 å½åæ¥å£ 299 ~~~~~~~~ 300 301 以ä¸çæ¥å£å±æ®éåå¨äºå½åçsysfsä¸: 302 303 - è®¾å¤ (include/linux/device.h) 304 ---------------------------------- 305 ç»æä½: 306 307 struct device_attribute { 308 struct attribute attr; 309 ssize_t (*show)(struct device *dev, struct device_attribute *attr, 310 char *buf); 311 ssize_t (*store)(struct device *dev, struct device_attribute *attr, 312 const char *buf, size_t count); 313 }; 314 315 声æ: 316 317 DEVICE_ATTR(_name, _mode, _show, _store); 318 319 å¢/å 屿§: 320 321 int device_create_file(struct device *dev, const struct device_attribute * attr); 322 void device_remove_file(struct device *dev, const struct device_attribute * attr); 323 324 325 - æ»çº¿é©±å¨ç¨åº (include/linux/device.h) 326 -------------------------------------- 327 ç»æä½: 328 329 struct bus_attribute { 330 struct attribute attr; 331 ssize_t (*show)(struct bus_type *, char * buf); 332 ssize_t (*store)(struct bus_type *, const char * buf, size_t count); 333 }; 334 335 声æ: 336 337 BUS_ATTR(_name, _mode, _show, _store) 338 339 å¢/å 屿§: 340 341 int bus_create_file(struct bus_type *, struct bus_attribute *); 342 void bus_remove_file(struct bus_type *, struct bus_attribute *); 343 344 345 - 设å¤é©±å¨ç¨åº (include/linux/device.h) 346 ----------------------------------------- 347 348 ç»æä½: 349 350 struct driver_attribute { 351 struct attribute attr; 352 ssize_t (*show)(struct device_driver *, char * buf); 353 ssize_t (*store)(struct device_driver *, const char * buf, 354 size_t count); 355 }; 356 357 声æ: 358 359 DRIVER_ATTR(_name, _mode, _show, _store) 360 361 å¢/å 屿§ï¼ 362 363 int driver_create_file(struct device_driver *, const struct driver_attribute *); 364 void driver_remove_file(struct device_driver *, const struct driver_attribute *); 365 366 367 ææ¡£ 368 ~~~~ 369 370 sysfs ç®å½ç»æä»¥åå ¶ä¸å å«ç屿§å®ä¹äºä¸ä¸ªå æ ¸ä¸ç¨æ·ç©ºé´ä¹é´ç ABIã 371 对äºä»»ä½ ABIï¼å ¶èªèº«ç稳å®åéå½çææ¡£æ¯é常éè¦çãæææ°ç sysfs 372 屿§å¿ é¡»å¨ Documentation/ABI ä¸æææ¡£ãè¯¦è§ Documentation/ABI/READMEã