From: Ninja Tekkaman <tekkamanninja@gmail.com> Date: Wed, 29 Aug 2012 04:54:41 +0000 (+0800) Subject: Documentation: Chinese translation of Documentation/filesystems/sysfs.txt X-Git-Tag: firefly_0821_release~3680^2~1978^2~49 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=b5ced6b3653afc7bd361735a1ade9d8739b9ebe5;p=firefly-linux-kernel-4.4.55.git Documentation: Chinese translation of Documentation/filesystems/sysfs.txt This is a Chinese translated version of Documentation/filesystems/sysfs.txt Signed-off-by: Fu Wei <tekkamanninja@gmail.com> Acked-by: Harry Wei <harryxiyou@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> --- diff --git a/Documentation/zh_CN/filesystems/sysfs.txt b/Documentation/zh_CN/filesystems/sysfs.txt new file mode 100644 index 000000000000..e230eaa33122 --- /dev/null +++ b/Documentation/zh_CN/filesystems/sysfs.txt @@ -0,0 +1,372 @@ +Chinese translated version of Documentation/filesystems/sysfs.txt + +If you have any comment or update to the content, please contact the +original document maintainer directly. However, if you have a problem +communicating in English you can also ask the Chinese maintainer for +help. Contact the Chinese maintainer if this translation is outdated +or if there is a problem with the translation. + +Maintainer: Patrick Mochel <mochel@osdl.org> + Mike Murphy <mamurph@cs.clemson.edu> +Chinese maintainer: Fu Wei <tekkamanninja@gmail.com> +--------------------------------------------------------------------- +Documentation/filesystems/sysfs.txt çä¸æç¿»è¯ + +妿æ³è¯è®ºææ´æ°æ¬æçå 容ï¼è¯·ç´æ¥èç³»åææ¡£çç»´æ¤è ãå¦æä½ ä½¿ç¨è±æ +äº¤æµæå°é¾çè¯ï¼ä¹å¯ä»¥å䏿çç»´æ¤è æ±å©ã妿æ¬ç¿»è¯æ´æ°ä¸åæ¶æè ç¿» +è¯åå¨é®é¢ï¼è¯·èç³»ä¸æçç»´æ¤è ã +è±æçç»´æ¤è ï¼ Patrick Mochel <mochel@osdl.org> + Mike Murphy <mamurph@cs.clemson.edu> +䏿çç»´æ¤è ï¼ å ç Fu Wei <tekkamanninja@gmail.com> +䏿çç¿»è¯è ï¼ å ç Fu Wei <tekkamanninja@gmail.com> +ä¸æçæ ¡è¯è ï¼ å ç Fu Wei <tekkamanninja@gmail.com> + + +以ä¸ä¸ºæ£æ +--------------------------------------------------------------------- +sysfs - ç¨äºå¯¼åºå æ ¸å¯¹è±¡(kobject)çæä»¶ç³»ç» + +Patrick Mochel <mochel@osdl.org> +Mike Murphy <mamurph@cs.clemson.edu> + +修订: 16 August 2011 +åå§çæ¬: 10 January 2003 + + +sysfs ç®ä»: +~~~~~~~~~~ + +sysfs æ¯ä¸ä¸ªæååºäº ramfs ä¸ä½äºå åçæä»¶ç³»ç»ã宿ä¾å¯¼åºå æ ¸ +æ°æ®ç»æåå ¶å±æ§ï¼ä»¥åå®ä»¬ä¹é´çå ³èå°ç¨æ·ç©ºé´çæ¹æ³ã + +sysfs å§ç»ä¸ kobject çåºå±ç»æç´§å¯ç¸å ³ã请é 读 +Documentation/kobject.txt ææ¡£ä»¥è·å¾æ´å¤å ³äº kobject æ¥å£ç +ä¿¡æ¯ã + + +ä½¿ç¨ sysfs +~~~~~~~~~~~ + +åªè¦å æ ¸é ç½®ä¸å®ä¹äº CONFIG_SYSFS ï¼sysfs æ»æ¯è¢«ç¼è¯è¿å æ ¸ãä½ å¯ +éè¿ä»¥ä¸å½ä»¤æè½½å®: + + mount -t sysfs sysfs /sys + + +å建ç®å½ +~~~~~~~~ + +ä»»ä½ kobject å¨ç³»ç»ä¸æ³¨åï¼å°±ä¼æä¸ä¸ªç®å½å¨ sysfs ä¸è¢«å建ãè¿ä¸ª +ç®å½æ¯ä½ä¸ºè¯¥ kobject çç¶å¯¹è±¡æå¨ç®å½çåç®å½å建çï¼ä»¥åç¡®å°ä¼ é +å æ ¸çå¯¹è±¡å±æ¬¡å°ç¨æ·ç©ºé´ãsysfs ä¸çé¡¶å±ç®å½ä»£è¡¨çå æ ¸å¯¹è±¡å±æ¬¡ç +å ±åç¥å ï¼ä¾å¦ï¼æäºå¯¹è±¡å±äºæä¸ªåç³»ç»ã + +Sysfs å¨ä¸å ¶ç®å½å ³èç sysfs_dirent 对象ä¸å é¨ä¿åä¸ä¸ªæåå®ç° +ç®å½ç kobject çæéã以åï¼è¿ä¸ª kobject æé被 sysfs ç´æ¥ç¨äº +kobject æä»¶æå¼åå ³éçå¼ç¨è®¡æ°ãèç°å¨ç sysfs å®ç°ä¸ï¼kobject +å¼ç¨è®¡æ°åªè½éè¿ sysfs_schedule_callback() 彿°ç´æ¥ä¿®æ¹ã + + +屿§ +~~~~ + +kobject ç屿§å¯å¨æä»¶ç³»ç»ä¸ä»¥æ®éæä»¶çå½¢å¼å¯¼åºãSysfs ä¸ºå±æ§å®ä¹ +äºé¢åæä»¶ I/O æä½çæ¹æ³ï¼ä»¥æä¾å¯¹å æ ¸å±æ§ç读åã + + +屿§åºä¸º ASCII ç ææ¬æä»¶ã以ä¸ä¸ªæä»¶åªåå¨ä¸ä¸ªå±æ§å¼ä¸ºå®ãä½ä¸ä¸ª +æä»¶åªå å«ä¸ä¸ªå±æ§å¼å¯è½å½±åæçï¼æä»¥ä¸ä¸ªå å«ç¸åæ°æ®ç±»åç屿§å¼ +æ°ç»ä¹è¢«å¹¿æ³å°æ¥åã + +æ··åç±»åã表达å¤è¡æ°æ®ä»¥åä¸äºæªå¼çæ°æ®æ ¼å¼ä¼éå°å¼ºçå对ãè¿æ ·åæ¯ +å¾ä¸¢è¸ç,èä¸å ¶ä»£ç ä¼å¨æªéç¥ä½è çæ åµä¸è¢«éåã + + +ä¸ä¸ªç®åç屿§ç»æå®ä¹å¦ä¸: + +struct attribute { + char * name; + struct module *owner; + umode_t mode; +}; + + +int sysfs_create_file(struct kobject * kobj, const struct attribute * attr); +void sysfs_remove_file(struct kobject * kobj, const struct attribute * attr); + + +ä¸ä¸ªåç¬ç屿§ç»æå¹¶ä¸å å«è¯»åå ¶å±æ§å¼çæ¹æ³ãåç³»ç»æå¥½ä¸ºå¢å ç¹å® +对象类åç屿§å®ä¹èªå·±ç屿§ç»æä½åå°è£ 彿°ã + +ä¾å¦:驱å¨ç¨åºæ¨¡åå®ä¹ç device_attribute ç»æä½å¦ä¸: + +struct device_attribute { + struct attribute attr; + ssize_t (*show)(struct device *dev, struct device_attribute *attr, + char *buf); + ssize_t (*store)(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count); +}; + +int device_create_file(struct device *, const struct device_attribute *); +void device_remove_file(struct device *, const struct device_attribute *); + +为äºå®ä¹è®¾å¤å±æ§ï¼åæ¶å®ä¹äºä¸ä¸è¾ å©å®: + +#define DEVICE_ATTR(_name, _mode, _show, _store) \ +struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store) + +ä¾å¦:声æ + +static DEVICE_ATTR(foo, S_IWUSR | S_IRUGO, show_foo, store_foo); + +çåäºå¦ä¸ä»£ç ï¼ + +static struct device_attribute dev_attr_foo = { + .attr = { + .name = "foo", + .mode = S_IWUSR | S_IRUGO, + .show = show_foo, + .store = store_foo, + }, +}; + + +åç³»ç»ç¹æçåè°å½æ° +~~~~~~~~~~~~~~~~~~~ + +å½ä¸ä¸ªåç³»ç»å®ä¹ä¸ä¸ªæ°ç屿§ç±»åæ¶ï¼å¿ é¡»å®ç°ä¸ç³»åç sysfs æä½ï¼ +以帮å©è¯»åè°ç¨å®ç°å±æ§ææè çæ¾ç¤ºåå¨åæ¹æ³ã + +struct sysfs_ops { + ssize_t (*show)(struct kobject *, struct attribute *, char *); + ssize_t (*store)(struct kobject *, struct attribute *, const char *, size_t); +}; + +[åç³»ç»åºå·²ç»å®ä¹äºä¸ä¸ª struct kobj_type ç»æä½ä½ä¸ºè¿ä¸ªç±»åç +æè¿°ç¬¦ï¼å¹¶å¨æ¤ä¿å sysfs_ops çæéãæ´å¤çä¿¡æ¯åè§ kobject ç +ææ¡£] + +sysfs ä¼ä¸ºè¿ä¸ªç±»åè°ç¨éå½çæ¹æ³ãå½ä¸ä¸ªæä»¶è¢«è¯»åæ¶ï¼è¿ä¸ªæ¹æ³ä¼ +å°ä¸è¬çkobject å attribute ç»æä½æé转æ¢ä¸ºéå½çæéç±»åå +è°ç¨ç¸å ³èç彿°ã + + +示ä¾: + +#define to_dev(obj) container_of(obj, struct device, kobj) +#define to_dev_attr(_attr) container_of(_attr, struct device_attribute, attr) + +static ssize_t dev_attr_show(struct kobject *kobj, struct attribute *attr, + char *buf) +{ + struct device_attribute *dev_attr = to_dev_attr(attr); + struct device *dev = to_dev(kobj); + ssize_t ret = -EIO; + + if (dev_attr->show) + ret = dev_attr->show(dev, dev_attr, buf); + if (ret >= (ssize_t)PAGE_SIZE) { + print_symbol("dev_attr_show: %s returned bad count\n", + (unsigned long)dev_attr->show); + } + return ret; +} + + + +读å屿§æ°æ® +~~~~~~~~~~~~ + +å¨å£°æå±æ§æ¶ï¼å¿ é¡»æå® show() æ store() æ¹æ³ï¼ä»¥å®ç°å±æ§ç +读æåãè¿äºæ¹æ³çç±»ååºè¯¥å以ä¸ç设å¤å±æ§å®ä¹ä¸æ ·ç®åã + +ssize_t (*show)(struct device *dev, struct device_attribute *attr, char *buf); +ssize_t (*store)(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count); + +ä¹å°±æ¯è¯´,ä»ä»¬åºåªä»¥ä¸ä¸ªå¤ç对象ãä¸ä¸ªå±æ§åä¸ä¸ªç¼å²æéä½ä¸ºåæ°ã + +sysfs ä¼åé ä¸ä¸ªå¤§å°ä¸º (PAGE_SIZE) çç¼å²åºå¹¶ä¼ éç»è¿ä¸ªæ¹æ³ã +Sysfs å°ä¼ä¸ºæ¯æ¬¡è¯»åæä½è°ç¨ä¸æ¬¡è¿ä¸ªæ¹æ³ãè¿ä½¿å¾è¿äºæ¹æ³å¨æ§è¡æ¶ +ä¼åºç°ä»¥ä¸çè¡ä¸º: + +- å¨è¯»æ¹é¢ï¼read(2)ï¼ï¼show() æ¹æ³åºè¯¥å¡«å æ´ä¸ªç¼å²åºã忳屿§ + åºåªå¯¼åºäºä¸ä¸ªå±æ§å¼ææ¯ä¸ä¸ªåç±»å屿§å¼çæ°ç»ï¼æä»¥è¿ä¸ªä»£ä»·å° + ä¸ä¼ä¸å¤ªé«ã + + è¿ä½¿å¾ç¨æ·ç©ºé´å¯ä»¥å±é¨å°è¯»åä»»æçååæç´¢æ´ä¸ªæä»¶ãå¦æç¨æ·ç©ºé´ + ååæç´¢å°é¶æä½¿ç¨â0âåç§»æ§è¡ä¸ä¸ªpread(2)æä½ï¼show()æ¹æ³å° + 忬¡è¢«è°ç¨ï¼ä»¥éæ°å¡«å ç¼åã + +- å¨åæ¹é¢ï¼write(2)ï¼ï¼sysfs 叿å¨ç¬¬ä¸æ¬¡åæä½æ¶å¾å°æ´ä¸ªç¼å²åºã + ä¹å Sysfs ä¼ éæ´ä¸ªç¼å²åºç» store() æ¹æ³ã + + å½è¦å sysfs æä»¶æ¶ï¼ç¨æ·ç©ºé´è¿ç¨åºé¦å è¯»åæ´ä¸ªæä»¶ï¼ä¿®è¯¥æ³è¦ + æ¹åçå¼ï¼ç¶åååæ´ä¸ªç¼å²åºã + + å¨è¯»å屿§å¼æ¶ï¼å±æ§æ¹æ³çæ§è¡åºæä½ç¸åçç¼å²åºã + +注记: + +- åæä½å¯¼è´ç show() æ¹æ³éè½½ï¼ä¼å¿½ç¥å½åæä»¶ä½ç½®ã + +- ç¼å²åºåºæ»æ¯ PAGE_SIZE 大å°ã对äºi386ï¼è¿ä¸ªå¼ä¸º4096ã + +- show() æ¹æ³åºè¯¥è¿ååå ¥ç¼å²åºçåèæ°ï¼ä¹å°±æ¯ snprintf()ç + è¿åå¼ã + +- show() åºå§ç»ä½¿ç¨ snprintf()ã + +- store() åºè¿åç¼å²åºçå·²ç¨åèæ°ã妿æ´ä¸ªç¼åé½å·²å¡«æ»¡ï¼åªéè¿å + count åæ°ã + +- show() æ store() å¯ä»¥è¿åé误å¼ãå½å¾å°ä¸ä¸ªéæ³å¼ï¼å¿ é¡»è¿åä¸ä¸ª + é误å¼ã + +- ä¸ä¸ªä¼ éç»æ¹æ³ç对象å°ä¼éè¿ sysfs è°ç¨å¯¹è±¡å åµçå¼ç¨è®¡æ°åºå®å¨ + å åä¸ãå°½ç®¡å¦æ¤ï¼å¯¹è±¡ä»£è¡¨çç©çå®ä½(å¦è®¾å¤)å¯è½å·²ä¸åå¨ãå¦æå¿ è¦ï¼ + åºè¯¥å®ç°ä¸ä¸ªæ£æµæºå¶ã + +ä¸ä¸ªç®åç(æªç»å®éªè¯å®ç)设å¤å±æ§å®ç°å¦ä¸ï¼ + +static ssize_t show_name(struct device *dev, struct device_attribute *attr, + char *buf) +{ + return scnprintf(buf, PAGE_SIZE, "%s\n", dev->name); +} + +static ssize_t store_name(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + snprintf(dev->name, sizeof(dev->name), "%.*s", + (int)min(count, sizeof(dev->name) - 1), buf); + return count; +} + +static DEVICE_ATTR(name, S_IRUGO, show_name, store_name); + + +ï¼æ³¨æï¼çæ£çå®ç°ä¸å è®¸ç¨æ·ç©ºé´è®¾ç½®è®¾å¤åãï¼ + +é¡¶å±ç®å½å¸å± +~~~~~~~~~~~~ + +sysfs ç®å½ç宿æ¾ç¤ºäºå æ ¸æ°æ®ç»æä¹é´çå ³ç³»ã + +é¡¶å± sysfs ç®å½å¦ä¸: + +block/ +bus/ +class/ +dev/ +devices/ +firmware/ +net/ +fs/ + +devices/ å å«äºä¸ä¸ªè®¾å¤æ çæä»¶ç³»ç»è¡¨ç¤ºãä»ç´æ¥æ å°äºå é¨çå æ ¸ +è®¾å¤æ ï¼åæ äºè®¾å¤ç屿¬¡ç»æã + +bus/ å å«äºå æ ¸ä¸åç§æ»çº¿ç±»åçå¹³é¢ç®å½å¸å±ãæ¯ä¸ªæ»çº¿ç®å½å å«ä¸¤ä¸ª +åç®å½: + + devices/ + drivers/ + +devices/ å å«äºç³»ç»ä¸åºç°çæ¯ä¸ªè®¾å¤ç符å·é¾æ¥ï¼ä»ä»¬æå root/ ä¸ç +设å¤ç®å½ã + +drivers/ å å«äºæ¯ä¸ªå·²ä¸ºç¹å®æ»çº¿ä¸ç设å¤èæè½½ç驱å¨ç¨åºçç®å½(è¿é +åå®é©±å¨æ²¡æè·¨è¶å¤ä¸ªæ»çº¿ç±»å)ã + +fs/ å å«äºä¸ä¸ªä¸ºæä»¶ç³»ç»è®¾ç«çç®å½ãç°å¨æ¯ä¸ªæ³è¦å¯¼åºå±æ§çæä»¶ç³»ç»å¿ é¡» +å¨ fs/ ä¸å建èªå·±ç屿¬¡ç»æ(åè§Documentation/filesystems/fuse.txt)ã + +dev/ å å«ä¸¤ä¸ªåç®å½ï¼ char/ å block/ãå¨è¿ä¸¤ä¸ªåç®å½ä¸ï¼æä»¥ +<major>:<minor> æ ¼å¼å½åç符å·é¾æ¥ãè¿äºç¬¦å·é¾æ¥æå sysfs ç®å½ +ä¸ç¸åºç设å¤ã/sys/dev æä¾ä¸ä¸ªéè¿ä¸ä¸ª stat(2) æä½ç»æï¼æ¥æ¾ +è®¾å¤ sysfs æ¥å£å¿«æ·çæ¹æ³ã + +æ´å¤æå ³ driver-model çç¹æ§ä¿¡æ¯å¯ä»¥å¨ Documentation/driver-model/ +䏿¾å°ã + + +TODO: 宿è¿ä¸èã + + +å½åæ¥å£ +~~~~~~~~ + +以ä¸çæ¥å£å±æ®éåå¨äºå½åçsysfsä¸: + +- è®¾å¤ (include/linux/device.h) +---------------------------------- +ç»æä½: + +struct device_attribute { + struct attribute attr; + ssize_t (*show)(struct device *dev, struct device_attribute *attr, + char *buf); + ssize_t (*store)(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count); +}; + +声æ: + +DEVICE_ATTR(_name, _mode, _show, _store); + +å¢/å 屿§: + +int device_create_file(struct device *dev, const struct device_attribute * attr); +void device_remove_file(struct device *dev, const struct device_attribute * attr); + + +- æ»çº¿é©±å¨ç¨åº (include/linux/device.h) +-------------------------------------- +ç»æä½: + +struct bus_attribute { + struct attribute attr; + ssize_t (*show)(struct bus_type *, char * buf); + ssize_t (*store)(struct bus_type *, const char * buf, size_t count); +}; + +声æ: + +BUS_ATTR(_name, _mode, _show, _store) + +å¢/å 屿§: + +int bus_create_file(struct bus_type *, struct bus_attribute *); +void bus_remove_file(struct bus_type *, struct bus_attribute *); + + +- 设å¤é©±å¨ç¨åº (include/linux/device.h) +----------------------------------------- + +ç»æä½: + +struct driver_attribute { + struct attribute attr; + ssize_t (*show)(struct device_driver *, char * buf); + ssize_t (*store)(struct device_driver *, const char * buf, + size_t count); +}; + +声æ: + +DRIVER_ATTR(_name, _mode, _show, _store) + +å¢/å 屿§ï¼ + +int driver_create_file(struct device_driver *, const struct driver_attribute *); +void driver_remove_file(struct device_driver *, const struct driver_attribute *); + + +ææ¡£ +~~~~ + +sysfs ç®å½ç»æä»¥åå ¶ä¸å å«ç屿§å®ä¹äºä¸ä¸ªå æ ¸ä¸ç¨æ·ç©ºé´ä¹é´ç ABIã +对äºä»»ä½ ABIï¼å ¶èªèº«ç稳å®åéå½çææ¡£æ¯é常éè¦çãæææ°ç sysfs +屿§å¿ é¡»å¨ Documentation/ABI ä¸æææ¡£ãè¯¦è§ Documentation/ABI/READMEã