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

TOMOYO Linux Cross Reference
Linux/Documentation/translations/zh_CN/filesystems/debugfs.rst

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_CN/filesystems/debugfs.rst (Version linux-6.12-rc7) and /Documentation/translations/zh_CN/filesystems/debugfs.rst (Version linux-5.13.19)


  1 .. SPDX-License-Identifier: GPL-2.0                 1 .. SPDX-License-Identifier: GPL-2.0
  2                                                     2 
  3 .. include:: ../disclaimer-zh_CN.rst                3 .. include:: ../disclaimer-zh_CN.rst
  4                                                     4 
  5 :Original: Documentation/filesystems/debugfs.r !!   5 :Original: :doc:`../../../filesystems/debugfs`
  6                                                     6 
  7 =======                                             7 =======
  8 Debugfs                                             8 Debugfs
  9 =======                                             9 =======
 10                                                    10 
 11 译者                                             11 译者
 12 ::                                                 12 ::
 13                                                    13 
 14         中文版维护者: 罗楚成 Chuche<     14         中文版维护者: 罗楚成 Chucheng Luo <luochucheng@vivo.com>
 15         中文版翻译者: 罗楚成 Chuche<     15         中文版翻译者: 罗楚成 Chucheng Luo <luochucheng@vivo.com>
 16         中文版校译者:  罗楚成 Chuchen<     16         中文版校译者:  罗楚成 Chucheng Luo <luochucheng@vivo.com>
 17                                                    17 
 18                                                    18 
 19                                                    19 
 20 版权所有2020 罗楚成 <luochucheng@vivo.co     20 版权所有2020 罗楚成 <luochucheng@vivo.com>
 21                                                    21 
 22                                                    22 
 23 Debugfs是内核开发人员在用户空间获     23 Debugfs是内核开发人员在用户空间获取信息的简单方法。与/proc不同,proc只提供进程
 24 信息。也不像sysfs,具有严格的“每     24 信息。也不像sysfs,具有严格的“每个文件一个值“的规则。debugfs根本没有规则,开发
 25 人员可以在这里放置他们想要的任     25 人员可以在这里放置他们想要的任何信息。debugfs文件系统也不能用作稳定的ABI接口。
 26 从理论上讲,debugfs导出文件的时候     26 从理论上讲,debugfs导出文件的时候没有任何约束。但是[1]实际情况并不总是那么
 27 简单。即使是debugfs接口,也最好根     27 简单。即使是debugfs接口,也最好根据需要进行设计,并尽量保持接口不变。
 28                                                    28 
 29                                                    29 
 30 Debugfs通常使用以下命令安装::            30 Debugfs通常使用以下命令安装::
 31                                                    31 
 32     mount -t debugfs none /sys/kernel/debug        32     mount -t debugfs none /sys/kernel/debug
 33                                                    33 
 34 (或等效的/etc/fstab行)。                 34 (或等效的/etc/fstab行)。
 35 debugfs根目录默认仅可由root用户访     35 debugfs根目录默认仅可由root用户访问。要更改对文件树的访问,请使用“ uid”,“ gid”
 36 和“ mode”挂载选项。请注意,debug     36 和“ mode”挂载选项。请注意,debugfs API仅按照GPL协议导出到模块。
 37                                                    37 
 38 使用debugfs的代码应包含<linux/debugfs.     38 使用debugfs的代码应包含<linux/debugfs.h>。然后,首先是创建至少一个目录来保存
 39 一组debugfs文件::                              39 一组debugfs文件::
 40                                                    40 
 41     struct dentry *debugfs_create_dir(const ch     41     struct dentry *debugfs_create_dir(const char *name, struct dentry *parent);
 42                                                    42 
 43 如果成功,此调用将在指定的父目     43 如果成功,此调用将在指定的父目录下创建一个名为name的目录。如果parent参数为空,
 44 则会在debugfs根目录中创建。创建目     44 则会在debugfs根目录中创建。创建目录成功时,返回值是一个指向dentry结构体的指针。
 45 该dentry结构体的指针可用于在目录     45 该dentry结构体的指针可用于在目录中创建文件(以及最后将其清理干净)。ERR_PTR
 46 (-ERROR)返回值表明出错。如果返     46 (-ERROR)返回值表明出错。如果返回ERR_PTR(-ENODEV),则表明内核是在没有debugfs
 47 支持的情况下构建的,并且下述函     47 支持的情况下构建的,并且下述函数都不会起作用。
 48                                                    48 
 49 在debugfs目录中创建文件的最通用方     49 在debugfs目录中创建文件的最通用方法是::
 50                                                    50 
 51     struct dentry *debugfs_create_file(const c     51     struct dentry *debugfs_create_file(const char *name, umode_t mode,
 52                                        struct      52                                        struct dentry *parent, void *data,
 53                                        const s     53                                        const struct file_operations *fops);
 54                                                    54 
 55 在这里,name是要创建的文件的名称     55 在这里,name是要创建的文件的名称,mode描述了访问文件应具有的权限,parent指向
 56 应该保存文件的目录,data将存储在     56 应该保存文件的目录,data将存储在产生的inode结构体的i_private字段中,而fops是
 57 一组文件操作函数,这些函数中实     57 一组文件操作函数,这些函数中实现文件操作的具体行为。至少,read()和/或
 58 write()操作应提供;其他可以根     58 write()操作应提供;其他可以根据需要包括在内。同样的,返回值将是指向创建文件
 59 的dentry指针,错误时返回ERR_PTR(-ER     59 的dentry指针,错误时返回ERR_PTR(-ERROR),系统不支持debugfs时返回值为ERR_PTR
 60 (-ENODEV)。创建一个初始大小的文     60 (-ENODEV)。创建一个初始大小的文件,可以使用以下函数代替::
 61                                                    61 
 62     struct dentry *debugfs_create_file_size(co     62     struct dentry *debugfs_create_file_size(const char *name, umode_t mode,
 63                                 struct dentry      63                                 struct dentry *parent, void *data,
 64                                 const struct f     64                                 const struct file_operations *fops,
 65                                 loff_t file_si     65                                 loff_t file_size);
 66                                                    66 
 67 file_size是初始文件大小。其他参数     67 file_size是初始文件大小。其他参数跟函数debugfs_create_file的相同。
 68                                                    68 
 69 在许多情况下,没必要自己去创建     69 在许多情况下,没必要自己去创建一组文件操作;对于一些简单的情况,debugfs代码提供
 70 了许多帮助函数。包含单个整数值     70 了许多帮助函数。包含单个整数值的文件可以使用以下任何一项创建::
 71                                                    71 
 72     void debugfs_create_u8(const char *name, u     72     void debugfs_create_u8(const char *name, umode_t mode,
 73                            struct dentry *pare     73                            struct dentry *parent, u8 *value);
 74     void debugfs_create_u16(const char *name,      74     void debugfs_create_u16(const char *name, umode_t mode,
 75                             struct dentry *par     75                             struct dentry *parent, u16 *value);
 76     struct dentry *debugfs_create_u32(const ch     76     struct dentry *debugfs_create_u32(const char *name, umode_t mode,
 77                                       struct d     77                                       struct dentry *parent, u32 *value);
 78     void debugfs_create_u64(const char *name,      78     void debugfs_create_u64(const char *name, umode_t mode,
 79                             struct dentry *par     79                             struct dentry *parent, u64 *value);
 80                                                    80 
 81 这些文件支持读取和写入给定值。     81 这些文件支持读取和写入给定值。如果某个文件不支持写入,只需根据需要设置mode
 82 参数位。这些文件中的值以十进制     82 参数位。这些文件中的值以十进制表示;如果需要使用十六进制,可以使用以下函数
 83 替代::                                           83 替代::
 84                                                    84 
 85     void debugfs_create_x8(const char *name, u     85     void debugfs_create_x8(const char *name, umode_t mode,
 86                            struct dentry *pare     86                            struct dentry *parent, u8 *value);
 87     void debugfs_create_x16(const char *name,      87     void debugfs_create_x16(const char *name, umode_t mode,
 88                             struct dentry *par     88                             struct dentry *parent, u16 *value);
 89     void debugfs_create_x32(const char *name,      89     void debugfs_create_x32(const char *name, umode_t mode,
 90                             struct dentry *par     90                             struct dentry *parent, u32 *value);
 91     void debugfs_create_x64(const char *name,      91     void debugfs_create_x64(const char *name, umode_t mode,
 92                             struct dentry *par     92                             struct dentry *parent, u64 *value);
 93                                                    93 
 94 这些功能只有在开发人员知道导出     94 这些功能只有在开发人员知道导出值的大小的时候才有用。某些数据类型在不同的架构上
 95 有不同的宽度,这样会使情况变得     95 有不同的宽度,这样会使情况变得有些复杂。在这种特殊情况下可以使用以下函数::
 96                                                    96 
 97     void debugfs_create_size_t(const char *nam     97     void debugfs_create_size_t(const char *name, umode_t mode,
 98                                struct dentry *     98                                struct dentry *parent, size_t *value);
 99                                                    99 
100 不出所料,此函数将创建一个debugfs    100 不出所料,此函数将创建一个debugfs文件来表示类型为size_t的变量。
101                                                   101 
102 同样地,也有导出无符号长整型变    102 同样地,也有导出无符号长整型变量的函数,分别以十进制和十六进制表示如下::
103                                                   103 
104     struct dentry *debugfs_create_ulong(const     104     struct dentry *debugfs_create_ulong(const char *name, umode_t mode,
105                                         struct    105                                         struct dentry *parent,
106                                         unsign    106                                         unsigned long *value);
107     void debugfs_create_xul(const char *name,     107     void debugfs_create_xul(const char *name, umode_t mode,
108                             struct dentry *par    108                             struct dentry *parent, unsigned long *value);
109                                                   109 
110 布尔值可以通过以下方式放置在debu    110 布尔值可以通过以下方式放置在debugfs中::
111                                                   111 
112     struct dentry *debugfs_create_bool(const c    112     struct dentry *debugfs_create_bool(const char *name, umode_t mode,
113                                        struct     113                                        struct dentry *parent, bool *value);
114                                                   114 
115                                                   115 
116 读取结果文件将产生Y(对于非零值    116 读取结果文件将产生Y(对于非零值)或N,后跟换行符写入的时候,它只接受大写或小写
117 值或1或0。任何其他输入将被忽略    117 值或1或0。任何其他输入将被忽略。
118                                                   118 
119 同样,atomic_t类型的值也可以放置    119 同样,atomic_t类型的值也可以放置在debugfs中::
120                                                   120 
121     void debugfs_create_atomic_t(const char *n    121     void debugfs_create_atomic_t(const char *name, umode_t mode,
122                                  struct dentry    122                                  struct dentry *parent, atomic_t *value)
123                                                   123 
124 读取此文件将获得atomic_t值,写入    124 读取此文件将获得atomic_t值,写入此文件将设置atomic_t值。
125                                                   125 
126 另一个选择是通过以下结构体和函    126 另一个选择是通过以下结构体和函数导出一个任意二进制数据块::
127                                                   127 
128     struct debugfs_blob_wrapper {                 128     struct debugfs_blob_wrapper {
129         void *data;                               129         void *data;
130         unsigned long size;                       130         unsigned long size;
131     };                                            131     };
132                                                   132 
133     struct dentry *debugfs_create_blob(const c    133     struct dentry *debugfs_create_blob(const char *name, umode_t mode,
134                                        struct     134                                        struct dentry *parent,
135                                        struct     135                                        struct debugfs_blob_wrapper *blob);
136                                                   136 
137 读取此文件将返回由指针指向debugfs    137 读取此文件将返回由指针指向debugfs_blob_wrapper结构体的数据。一些驱动使用“blobs”
138 作为一种返回几行(静态)格式化    138 作为一种返回几行(静态)格式化文本的简单方法。这个函数可用于导出二进制信息,但
139 似乎在主线中没有任何代码这样做    139 似乎在主线中没有任何代码这样做。请注意,使用debugfs_create_blob()命令创建的
140 所有文件是只读的。                       140 所有文件是只读的。
141                                                   141 
142 如果您要转储一个寄存器块(在开    142 如果您要转储一个寄存器块(在开发过程中经常会这么做,但是这样的调试代码很少上传
143 到主线中。Debugfs提供两个函数:一    143 到主线中。Debugfs提供两个函数:一个用于创建仅寄存器文件,另一个把一个寄存器块
144 插入一个顺序文件中::                     144 插入一个顺序文件中::
145                                                   145 
146     struct debugfs_reg32 {                        146     struct debugfs_reg32 {
147         char *name;                               147         char *name;
148         unsigned long offset;                     148         unsigned long offset;
149     };                                            149     };
150                                                   150 
151     struct debugfs_regset32 {                     151     struct debugfs_regset32 {
152         struct debugfs_reg32 *regs;               152         struct debugfs_reg32 *regs;
153         int nregs;                                153         int nregs;
154         void __iomem *base;                       154         void __iomem *base;
155     };                                            155     };
156                                                   156 
157     struct dentry *debugfs_create_regset32(con    157     struct dentry *debugfs_create_regset32(const char *name, umode_t mode,
158                                      struct de    158                                      struct dentry *parent,
159                                      struct de    159                                      struct debugfs_regset32 *regset);
160                                                   160 
161     void debugfs_print_regs32(struct seq_file     161     void debugfs_print_regs32(struct seq_file *s, struct debugfs_reg32 *regs,
162                          int nregs, void __iom    162                          int nregs, void __iomem *base, char *prefix);
163                                                   163 
164 “base”参数可能为0,但您可能需    164 “base”参数可能为0,但您可能需要使用__stringify构建reg32数组,实际上有许多寄存器
165 名称(宏)是寄存器块在基址上的    165 名称(宏)是寄存器块在基址上的字节偏移量。
166                                                   166 
167 如果要在debugfs中转储u32数组,可以    167 如果要在debugfs中转储u32数组,可以使用以下函数创建文件::
168                                                   168 
169      void debugfs_create_u32_array(const char     169      void debugfs_create_u32_array(const char *name, umode_t mode,
170                         struct dentry *parent,    170                         struct dentry *parent,
171                         u32 *array, u32 elemen    171                         u32 *array, u32 elements);
172                                                   172 
173 “array”参数提供数据,而“elements    173 “array”参数提供数据,而“elements”参数为数组中元素的数量。注意:数组创建后,数组
174 大小无法更改。                             174 大小无法更改。
175                                                   175 
176 有一个函数来创建与设备相关的seq_    176 有一个函数来创建与设备相关的seq_file::
177                                                   177 
178    struct dentry *debugfs_create_devm_seqfile(    178    struct dentry *debugfs_create_devm_seqfile(struct device *dev,
179                                 const char *na    179                                 const char *name,
180                                 struct dentry     180                                 struct dentry *parent,
181                                 int (*read_fn)    181                                 int (*read_fn)(struct seq_file *s,
182                                         void *    182                                         void *data));
183                                                   183 
184 “dev”参数是与此debugfs文件相关的    184 “dev”参数是与此debugfs文件相关的设备,并且“read_fn”是一个函数指针,这个函数在
185 打印seq_file内容的时候被回调。         185 打印seq_file内容的时候被回调。
186                                                   186 
187 还有一些其他的面向目录的函数::      187 还有一些其他的面向目录的函数::
188                                                   188 
189     struct dentry *debugfs_rename(struct dentr    189     struct dentry *debugfs_rename(struct dentry *old_dir,
190                                   struct dentr    190                                   struct dentry *old_dentry,
191                                   struct dentr    191                                   struct dentry *new_dir,
192                                   const char *    192                                   const char *new_name);
193                                                   193 
194     struct dentry *debugfs_create_symlink(cons    194     struct dentry *debugfs_create_symlink(const char *name,
195                                           stru    195                                           struct dentry *parent,
196                                           cons    196                                           const char *target);
197                                                   197 
198 调用debugfs_rename()将为现有的debugfs    198 调用debugfs_rename()将为现有的debugfs文件重命名,可能同时切换目录。 new_name
199 函数调用之前不能存在;返回值为o    199 函数调用之前不能存在;返回值为old_dentry,其中包含更新的信息。可以使用
200 debugfs_create_symlink()创建符号链接    200 debugfs_create_symlink()创建符号链接。
201                                                   201 
202 所有debugfs用户必须考虑的一件事是    202 所有debugfs用户必须考虑的一件事是:
203                                                   203 
204 debugfs不会自动清除在其中创建的任    204 debugfs不会自动清除在其中创建的任何目录。如果一个模块在不显式删除debugfs目录的
205 情况下卸载模块,结果将会遗留很    205 情况下卸载模块,结果将会遗留很多野指针,从而导致系统不稳定。因此,所有debugfs
206 用户-至少是那些可以作为模块构建    206 用户-至少是那些可以作为模块构建的用户-必须做模块卸载的时候准备删除在此创建的
207 所有文件和目录。一份文件可以通    207 所有文件和目录。一份文件可以通过以下方式删除::
208                                                   208 
209     void debugfs_remove(struct dentry *dentry)    209     void debugfs_remove(struct dentry *dentry);
210                                                   210 
211 dentry值可以为NULL或错误值,在这种    211 dentry值可以为NULL或错误值,在这种情况下,不会有任何文件被删除。
212                                                   212 
213 很久以前,内核开发者使用debugfs时    213 很久以前,内核开发者使用debugfs时需要记录他们创建的每个dentry指针,以便最后所有
214 文件都可以被清理掉。但是,现在d    214 文件都可以被清理掉。但是,现在debugfs用户能调用以下函数递归清除之前创建的文件::
215                                                   215 
216     void debugfs_remove_recursive(struct dentr    216     void debugfs_remove_recursive(struct dentry *dentry);
217                                                   217 
218 如果将对应顶层目录的dentry传递给    218 如果将对应顶层目录的dentry传递给以上函数,则该目录下的整个层次结构将会被删除。
219                                                   219 
220 注释:                                         220 注释:
221 [1] http://lwn.net/Articles/309298/               221 [1] http://lwn.net/Articles/309298/
                                                      

~ [ 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