四川省妇幼保健院怎样:debugfs -- usefull linux kernel debug tools

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 10:21:25
debugfs -- usefull linux kernel debug tools2009-08-27 14:16 linux2.6.11内核引入debugfs技术(和bash命令中的debugfs毫无关系)。它提供了一种用户空间查看内核信息的方法,并且可以通过使用模块的方式使得可以动态查看内核中的不同信息。

/proc文件系统同样提供了相同的功能,但是这些信息是在内核中已经指定好了的。如果要查看这些信息之外的内容,必须要重新修改内核:添加/proc选项,编译内核,重新启动机器等一些列过程。如果某次又还要查看更多的信息,还要重复上述的过程。最关键的是需要重新启动机器。

与通过/proc文件系统获取内核信息不同的是:如果需要查看目前内核中没有统计的信息,只要更改下使用debugfs统计信息的模块,即更改或添加输出信息的内容,重新编译模块,加载模块。然后就可以看见需要的内容了。注意:这个过程不需要重新启动机器。并且这种的信息统计工作可以随时通过卸载模块的方式去除掉。但是这也有一个限制:就是debugfs是通过模块的方式加载的,所以需要统计的内核变量必须要通过宏EXPORT_SYMBOL输出才行,但是这个工作可以一次性的都做完。以后就不会改内核了。

连接:http://lwn.net/Articles/115405/ 讲述了如何使用debugfs提供的API。下面通过一个例子具体地解释如何编写一个简单的使用debugfs统计内核信息的模块:

---debug_test.c:

#include
#include
#include

static struct dentry *root_entry, *total_pages_entry;
static u64 total_pages;

extern long vm_total_pages;
static int __init debugfs_test_init(void)
{
total_pages = (u64)vm_total_pages;
root_entry = debugfs_create_dir("debugfs-root", NULL);
if (!root_entry) {
printk("Fail to create proc dir: debugfs-root\n");
return 1;
}

total_pages_entry = debugfs_create_u64("
total_pages", 0644, root_entry, &total_pages);

return 0;
}

static void __exit debugfs_test_exit(void)
{
debugfs_remove(total_pages_entry);
debugfs_remove(root_entry);
}

module_init(debugfs_test_init);
module_exit(debugfs_test_exit);
MODULE_LICENSE("GPL");


----Makefile:
obj-m += debugfs_test.o

all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean


在执行完make命令后插入模块之前,还需要做一件事:挂载debugfs根目录,如下:
mount -t debugfs debugfs 挂载点(例如/home/debugfs)

然后加载模块:
insmod debugfs_test.ko

之后在进入到debugfs的根目录下(cd /home/debugfs),就可以看见有一个名字为debugfs-root的目录。其下有文件名为total_pages。然后cat一下这个文件就可以查看总的页面信息了。

在这个例子中需要注意的是:内核中的变量vm_total_pages默认没有被输出。这里要将这个变量使用宏EXPORT_SYMBOL输出才行(例如:EXPORT_SYMBOL(vm_total_pages);)