From 036168e3df3688ff4bf0836f72f68da490fe8c47 Mon Sep 17 00:00:00 2001 From: Chucheng Luo <luochucheng@vivo.com> Date: Sat, 9 May 2020 01:05:35 -0700 Subject: [PATCH] doc: zh_CN: add translatation for debugfs.txt Translate Documentation/filesystems/debugfs.txt into Chinese. Signed-off-by: Chucheng Luo <luochucheng@vivo.com> Reviewed-by: Alex Shi <alex.shi@linux.alibaba.com> Signed-off-by: Wang Wenhu <wenhu.wang@vivo.com> [rebase for upstream conflict and minor change of subject] Link: https://lore.kernel.org/linux-doc/20200408021528.14062-1-luochucheng@vivo.com/ Link: https://lore.kernel.org/r/20200509080535.7625-1-wenhu.wang@vivo.com Signed-off-by: Jonathan Corbet <corbet@lwn.net> --- .../zh_CN/filesystems/debugfs.rst | 221 ++++++++++++++++++ .../translations/zh_CN/filesystems/index.rst | 1 + 2 files changed, 222 insertions(+) create mode 100644 Documentation/translations/zh_CN/filesystems/debugfs.rst diff --git a/Documentation/translations/zh_CN/filesystems/debugfs.rst b/Documentation/translations/zh_CN/filesystems/debugfs.rst new file mode 100644 index 000000000000..f8a28793c277 --- /dev/null +++ b/Documentation/translations/zh_CN/filesystems/debugfs.rst @@ -0,0 +1,221 @@ +.. SPDX-License-Identifier: GPL-2.0 + +.. include:: ../disclaimer-zh_CN.rst + +:Original: :ref:`Documentation/filesystems/debugfs.txt <debugfs_index>` + +======= +Debugfs +======= + +译者 +:: + + ä¸æ–‡ç‰ˆç»´æŠ¤è€…: ç½—æ¥šæˆ Chucheng Luo <luochucheng@vivo.com> + ä¸æ–‡ç‰ˆç¿»è¯‘者: ç½—æ¥šæˆ Chucheng Luo <luochucheng@vivo.com> + ä¸æ–‡ç‰ˆæ ¡è¯‘者: ç½—æ¥šæˆ Chucheng Luo <luochucheng@vivo.com> + + + +版æƒæ‰€æœ‰2020 ç½—æ¥šæˆ <luochucheng@vivo.com> + + +Debugfsæ˜¯å†…æ ¸å¼€å‘人员在用户空间获å–ä¿¡æ¯çš„简å•æ–¹æ³•ã€‚与/procä¸åŒï¼Œprocåªæ供进程 +ä¿¡æ¯ã€‚也ä¸åƒsysfs,å…·æœ‰ä¸¥æ ¼çš„â€œæ¯ä¸ªæ–‡ä»¶ä¸€ä¸ªå€¼â€œçš„规则。debugfsæ ¹æœ¬æ²¡æœ‰è§„åˆ™,å¼€å‘ +人员å¯ä»¥åœ¨è¿™é‡Œæ”¾ç½®ä»–们想è¦çš„任何信æ¯ã€‚debugfs文件系统也ä¸èƒ½ç”¨ä½œç¨³å®šçš„ABI接å£ã€‚ +从ç†è®ºä¸Šè®²ï¼Œdebugfs导出文件的时候没有任何约æŸã€‚但是[1]实际情况并ä¸æ€»æ˜¯é‚£ä¹ˆ +简å•ã€‚å³ä½¿æ˜¯debugfs接å£ï¼Œä¹Ÿæœ€å¥½æ ¹æ®éœ€è¦è¿›è¡Œè®¾è®¡,并尽é‡ä¿æŒæŽ¥å£ä¸å˜ã€‚ + + +Debugfs通常使用以下命令安装:: + + mount -t debugfs none /sys/kernel/debug + +(或ç‰æ•ˆçš„/etc/fstab行)。 +debugfsæ ¹ç›®å½•é»˜è®¤ä»…å¯ç”±root用户访问。è¦æ›´æ”¹å¯¹æ–‡ä»¶æ ‘的访问,请使用“ uidâ€ï¼Œâ€œ gid†+和“ modeâ€æŒ‚载选项。请注æ„,debugfs API仅按照GPLå议导出到模å—。 + +使用debugfs的代ç 应包å«<linux/debugfs.h>。然åŽï¼Œé¦–先是创建至少一个目录æ¥ä¿å˜ +一组debugfs文件:: + + struct dentry *debugfs_create_dir(const char *name, struct dentry *parent); + +如果æˆåŠŸï¼Œæ¤è°ƒç”¨å°†åœ¨æŒ‡å®šçš„父目录下创建一个å为name的目录。如果parentå‚数为空, +则会在debugfsæ ¹ç›®å½•ä¸åˆ›å»ºã€‚创建目录æˆåŠŸæ—¶ï¼Œè¿”回值是一个指å‘dentry结构体的指针。 +该dentry结构体的指针å¯ç”¨äºŽåœ¨ç›®å½•ä¸åˆ›å»ºæ–‡ä»¶ï¼ˆä»¥åŠæœ€åŽå°†å…¶æ¸…ç†å¹²å‡€ï¼‰ã€‚ERR_PTR +(-ERROR)返回值表明出错。如果返回ERR_PTR(-ENODEVï¼‰ï¼Œåˆ™è¡¨æ˜Žå†…æ ¸æ˜¯åœ¨æ²¡æœ‰debugfs +支æŒçš„情况下构建的,并且下述函数都ä¸ä¼šèµ·ä½œç”¨ã€‚ + +在debugfs目录ä¸åˆ›å»ºæ–‡ä»¶çš„最通用方法是:: + + struct dentry *debugfs_create_file(const char *name, umode_t mode, + struct dentry *parent, void *data, + const struct file_operations *fops); + +在这里,name是è¦åˆ›å»ºçš„文件的å称,modeæ述了访问文件应具有的æƒé™ï¼ŒparentæŒ‡å‘ +应该ä¿å˜æ–‡ä»¶çš„目录,dataå°†å˜å‚¨åœ¨äº§ç”Ÿçš„inode结构体的i_privateå—段ä¸ï¼Œè€Œfops是 +一组文件æ“作函数,这些函数ä¸å®žçŽ°æ–‡ä»¶æ“作的具体行为。至少,read()和/或 +write()æ“作应æ供;其他å¯ä»¥æ ¹æ®éœ€è¦åŒ…括在内。åŒæ ·çš„,返回值将是指å‘创建文件 +çš„dentry指针,错误时返回ERR_PTR(-ERROR),系统ä¸æ”¯æŒdebugfs时返回值为ERR_PTR +(-ENODEV)。创建一个åˆå§‹å¤§å°çš„文件,å¯ä»¥ä½¿ç”¨ä»¥ä¸‹å‡½æ•°ä»£æ›¿:: + + struct dentry *debugfs_create_file_size(const char *name, umode_t mode, + struct dentry *parent, void *data, + const struct file_operations *fops, + loff_t file_size); + +file_size是åˆå§‹æ–‡ä»¶å¤§å°ã€‚其他å‚数跟函数debugfs_create_file的相åŒã€‚ + +在许多情况下,没必è¦è‡ªå·±åŽ»åˆ›å»ºä¸€ç»„文件æ“作;对于一些简å•çš„情况,debugfs代ç æä¾› +了许多帮助函数。包å«å•ä¸ªæ•´æ•°å€¼çš„文件å¯ä»¥ä½¿ç”¨ä»¥ä¸‹ä»»ä½•ä¸€é¡¹åˆ›å»º:: + + void debugfs_create_u8(const char *name, umode_t mode, + struct dentry *parent, u8 *value); + void debugfs_create_u16(const char *name, umode_t mode, + struct dentry *parent, u16 *value); + struct dentry *debugfs_create_u32(const char *name, umode_t mode, + struct dentry *parent, u32 *value); + void debugfs_create_u64(const char *name, umode_t mode, + struct dentry *parent, u64 *value); + +这些文件支æŒè¯»å–和写入给定值。如果æŸä¸ªæ–‡ä»¶ä¸æ”¯æŒå†™å…¥ï¼Œåªéœ€æ ¹æ®éœ€è¦è®¾ç½®mode +å‚æ•°ä½ã€‚这些文件ä¸çš„值以å进制表示;如果需è¦ä½¿ç”¨åå…进制,å¯ä»¥ä½¿ç”¨ä»¥ä¸‹å‡½æ•° +替代:: + + void debugfs_create_x8(const char *name, umode_t mode, + struct dentry *parent, u8 *value); + void debugfs_create_x16(const char *name, umode_t mode, + struct dentry *parent, u16 *value); + void debugfs_create_x32(const char *name, umode_t mode, + struct dentry *parent, u32 *value); + void debugfs_create_x64(const char *name, umode_t mode, + struct dentry *parent, u64 *value); + +这些功能åªæœ‰åœ¨å¼€å‘人员知é“导出值的大å°çš„时候æ‰æœ‰ç”¨ã€‚æŸäº›æ•°æ®ç±»åž‹åœ¨ä¸åŒçš„架构上 +有ä¸åŒçš„å®½åº¦ï¼Œè¿™æ ·ä¼šä½¿æƒ…å†µå˜å¾—有些å¤æ‚。在这ç§ç‰¹æ®Šæƒ…况下å¯ä»¥ä½¿ç”¨ä»¥ä¸‹å‡½æ•°:: + + void debugfs_create_size_t(const char *name, umode_t mode, + struct dentry *parent, size_t *value); + +ä¸å‡ºæ‰€æ–™ï¼Œæ¤å‡½æ•°å°†åˆ›å»ºä¸€ä¸ªdebugfs文件æ¥è¡¨ç¤ºç±»åž‹ä¸ºsize_tçš„å˜é‡ã€‚ + +åŒæ ·åœ°ï¼Œä¹Ÿæœ‰å¯¼å‡ºæ— 符å·é•¿æ•´åž‹å˜é‡çš„函数,分别以å进制和åå…进制表示如下:: + + struct dentry *debugfs_create_ulong(const char *name, umode_t mode, + struct dentry *parent, + unsigned long *value); + void debugfs_create_xul(const char *name, umode_t mode, + struct dentry *parent, unsigned long *value); + +布尔值å¯ä»¥é€šè¿‡ä»¥ä¸‹æ–¹å¼æ”¾ç½®åœ¨debugfsä¸:: + + struct dentry *debugfs_create_bool(const char *name, umode_t mode, + struct dentry *parent, bool *value); + + +读å–结果文件将产生Y(对于éžé›¶å€¼ï¼‰æˆ–N,åŽè·Ÿæ¢è¡Œç¬¦å†™å…¥çš„时候,它åªæŽ¥å—大写或å°å†™ +值或1或0。任何其他输入将被忽略。 + +åŒæ ·ï¼Œatomic_t类型的值也å¯ä»¥æ”¾ç½®åœ¨debugfsä¸:: + + void debugfs_create_atomic_t(const char *name, umode_t mode, + struct dentry *parent, atomic_t *value) + +读å–æ¤æ–‡ä»¶å°†èŽ·å¾—atomic_t值,写入æ¤æ–‡ä»¶å°†è®¾ç½®atomic_t值。 + +å¦ä¸€ä¸ªé€‰æ‹©æ˜¯é€šè¿‡ä»¥ä¸‹ç»“构体和函数导出一个任æ„二进制数æ®å—:: + + struct debugfs_blob_wrapper { + void *data; + unsigned long size; + }; + + struct dentry *debugfs_create_blob(const char *name, umode_t mode, + struct dentry *parent, + struct debugfs_blob_wrapper *blob); + +读å–æ¤æ–‡ä»¶å°†è¿”回由指针指å‘debugfs_blob_wrapper结构体的数æ®ã€‚一些驱动使用“blobs†+作为一ç§è¿”å›žå‡ è¡Œï¼ˆé™æ€ï¼‰æ ¼å¼åŒ–文本的简å•æ–¹æ³•ã€‚这个函数å¯ç”¨äºŽå¯¼å‡ºäºŒè¿›åˆ¶ä¿¡æ¯ï¼Œä½† +似乎在主线ä¸æ²¡æœ‰ä»»ä½•ä»£ç è¿™æ ·åšã€‚请注æ„,使用debugfs_create_blob()命令创建的 +所有文件是åªè¯»çš„。 + +如果您è¦è½¬å‚¨ä¸€ä¸ªå¯„å˜å™¨å—(在开å‘过程ä¸ç»å¸¸ä¼šè¿™ä¹ˆåšï¼Œä½†æ˜¯è¿™æ ·çš„调试代ç å¾ˆå°‘ä¸Šä¼ +到主线ä¸ã€‚Debugfsæ供两个函数:一个用于创建仅寄å˜å™¨æ–‡ä»¶ï¼Œå¦ä¸€ä¸ªæŠŠä¸€ä¸ªå¯„å˜å™¨å— +æ’入一个顺åºæ–‡ä»¶ä¸:: + + struct debugfs_reg32 { + char *name; + unsigned long offset; + }; + + struct debugfs_regset32 { + struct debugfs_reg32 *regs; + int nregs; + void __iomem *base; + }; + + struct dentry *debugfs_create_regset32(const char *name, umode_t mode, + struct dentry *parent, + struct debugfs_regset32 *regset); + + void debugfs_print_regs32(struct seq_file *s, struct debugfs_reg32 *regs, + int nregs, void __iomem *base, char *prefix); + +“baseâ€å‚æ•°å¯èƒ½ä¸º0,但您å¯èƒ½éœ€è¦ä½¿ç”¨__stringify构建reg32数组,实际上有许多寄å˜å™¨ +å称(å®ï¼‰æ˜¯å¯„å˜å™¨å—在基å€ä¸Šçš„å—节å移é‡ã€‚ + +如果è¦åœ¨debugfsä¸è½¬å‚¨u32数组,å¯ä»¥ä½¿ç”¨ä»¥ä¸‹å‡½æ•°åˆ›å»ºæ–‡ä»¶:: + + void debugfs_create_u32_array(const char *name, umode_t mode, + struct dentry *parent, + u32 *array, u32 elements); + +“arrayâ€å‚æ•°æ供数æ®ï¼Œè€Œâ€œelementsâ€å‚数为数组ä¸å…ƒç´ çš„æ•°é‡ã€‚注æ„:数组创建åŽï¼Œæ•°ç»„ +大å°æ— 法更改。 + +有一个函数æ¥åˆ›å»ºä¸Žè®¾å¤‡ç›¸å…³çš„seq_file:: + + struct dentry *debugfs_create_devm_seqfile(struct device *dev, + const char *name, + struct dentry *parent, + int (*read_fn)(struct seq_file *s, + void *data)); + +“devâ€å‚数是与æ¤debugfs文件相关的设备,并且“read_fnâ€æ˜¯ä¸€ä¸ªå‡½æ•°æŒ‡é’ˆï¼Œè¿™ä¸ªå‡½æ•°åœ¨ +打å°seq_file内容的时候被回调。 + +还有一些其他的é¢å‘目录的函数:: + + struct dentry *debugfs_rename(struct dentry *old_dir, + struct dentry *old_dentry, + struct dentry *new_dir, + const char *new_name); + + struct dentry *debugfs_create_symlink(const char *name, + struct dentry *parent, + const char *target); + +调用debugfs_rename()将为现有的debugfs文件é‡å‘½å,å¯èƒ½åŒæ—¶åˆ‡æ¢ç›®å½•ã€‚ new_name +函数调用之å‰ä¸èƒ½å˜åœ¨ï¼›è¿”回值为old_dentry,其ä¸åŒ…å«æ›´æ–°çš„ä¿¡æ¯ã€‚å¯ä»¥ä½¿ç”¨ +debugfs_create_symlink()创建符å·é“¾æŽ¥ã€‚ + +所有debugfs用户必须考虑的一件事是: + +debugfsä¸ä¼šè‡ªåŠ¨æ¸…除在其ä¸åˆ›å»ºçš„任何目录。如果一个模å—在ä¸æ˜¾å¼åˆ 除debugfs目录的 +情况下å¸è½½æ¨¡å—,结果将会é—留很多野指针,从而导致系统ä¸ç¨³å®šã€‚å› æ¤ï¼Œæ‰€æœ‰debugfs +用户-至少是那些å¯ä»¥ä½œä¸ºæ¨¡å—构建的用户-å¿…é¡»åšæ¨¡å—å¸è½½çš„æ—¶å€™å‡†å¤‡åˆ é™¤åœ¨æ¤åˆ›å»ºçš„ +所有文件和目录。一份文件å¯ä»¥é€šè¿‡ä»¥ä¸‹æ–¹å¼åˆ 除:: + + void debugfs_remove(struct dentry *dentry); + +dentry值å¯ä»¥ä¸ºNULL或错误值,在这ç§æƒ…况下,ä¸ä¼šæœ‰ä»»ä½•æ–‡ä»¶è¢«åˆ 除。 + +很久以å‰ï¼Œå†…æ ¸å¼€å‘者使用debugfs时需è¦è®°å½•ä»–们创建的æ¯ä¸ªdentry指针,以便最åŽæ‰€æœ‰ +文件都å¯ä»¥è¢«æ¸…ç†æŽ‰ã€‚但是,现在debugfs用户能调用以下函数递归清除之å‰åˆ›å»ºçš„文件:: + + void debugfs_remove_recursive(struct dentry *dentry); + +如果将对应顶层目录的dentryä¼ é€’ç»™ä»¥ä¸Šå‡½æ•°ï¼Œåˆ™è¯¥ç›®å½•ä¸‹çš„æ•´ä¸ªå±‚æ¬¡ç»“æž„å°†ä¼šè¢«åˆ é™¤ã€‚ + +注释: +[1] http://lwn.net/Articles/309298/ diff --git a/Documentation/translations/zh_CN/filesystems/index.rst b/Documentation/translations/zh_CN/filesystems/index.rst index 14f155edaf69..186501d13bc1 100644 --- a/Documentation/translations/zh_CN/filesystems/index.rst +++ b/Documentation/translations/zh_CN/filesystems/index.rst @@ -24,4 +24,5 @@ Linux Kernelä¸çš„文件系统 :maxdepth: 2 virtiofs + debugfs -- GitLab