linux debugfs根目录,Linux DebugFS 子目录也是用debugfs_create_dir来实现(转)

DebugFS,是一种用于内核调试的虚拟文件系统,内核通过debugfs和用户空间交换数据。类似procfs和sysfs等,这些文件系统都在内存里。

最常用的内核调试手段是printk。但在调试时可能需要修改某些内核变量,这时printk就无能为力,procfs和sysfs虽然也可以实现这个功能,但是偏离了本意,故debugfs从天而降。默认情况下,debugfs会被挂载在目录/sys/kernel/debug之下,如果没有自动挂载,可以用如下命令手动完成:

# mount -t

debugfs none /sys/kernel/debug

我们分三种情况说明debugfs如何使用

比如生成树形目录结构如下的调试开关或变量:

mydebug 目录

subdir 目录

c 文件

a 变量

b blob变量

其中,a对应模块中的一个u8类型的变量,b和subdir下面的c都是对应模块里的一个字符数组,只是它们的实现方式不同。

在module_init里,我们首先要建立根目录mydebug:

my_debugfs_root =

debugfs_create_dir("mydebug",

NULL);

第一个参数是目录的名称,第二个参数用来指定这个目录的上级目录,如果是NULL,则表示是放在debugfs的根目录里

子目录也是用debugfs_create_dir来实现

sub_dir =

debugfs_create_dir("subdir",

my_debugfs_root);

建立文件a的代码非常简单:

debugfs_create_u8("a", 0644,

my_debugfs_root, &a);

这表示文件名为“a”,文件属性是0644,父目录是上面建立的“mydebug”,对应的变量是模块中的a。

b是一个32-bytes的字符数组,在debugfs里,数组可以用blob wrapper来实现。

char hello[32] = "hello";

struct debugfs_blob_wrapper b;

b.data = (void*)hello;

b.size = strlen(hello) + 1;

debugfs_create_blob("b", 0444,

my_debugfs_root, &b);

blob wapper定义的数据只能是只读的。

那如何往内核里些数据调试呢?通过自定义的文件操作同时实现了读和写。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

static int c_open(struct inode

*inode, struct

file *filp)

{

filp->private_data

= (void*)hello;

return

0;

}

static ssize_t

c_read(struct

file *filp, char __user

*buffer,

size_t

count, loff_t *ppos)

{

if

(*ppos >= 32)

return

0;

if

(*ppos + count > 32)

count

= 32 - *ppos;

if

(copy_to_user(buffer, filp->private +

*ppos, count))

return

-EFAULT;

*ppos

+= count;

return

count;

}

static ssize_t

c_write(struct

file *filp, const char __user

*buffer,

size_t

count, loff_t *ppos)

{

if

(*ppos >= 32)

return

0;

if

(*ppos + count > 32)

count

= 32 - *ppos;

if

(copy_from_user(filp->private + *ppos,

buffer, count))

return

-EFAULT;

*ppos

+= count;

return

count;

}

struct file_operations c_fops = {

.owner

= THIS_MODULE,

.open

= c_open,

.read

= c_read,

.write

= c_write,

};

debugfs_create_file("c", 0644, sub_dir,

NULL, &c_fops);

三个文件和子目录已经创建完毕。在module_exit中,我们要记得释放创建的数据。

debugfs_remove_recursive可以帮我们逐步移除每个分配的dentry,如果您想一个一个手动的移除,也可以直接调用debugfs_remove。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值