无法从内核模块访问super_blocks列表:undefined!

时间:2011-02-19 13:49:49

标签: linux-kernel

我正在尝试编写一个内核模块,它会打印一些有关VFS子系统中对象的信息。这样我想了解VFS的工作原理以及它使用的结构。

但是,由于此编译器警告,我无法设法迭代super_blocks列表:

WARNING: "super_blocks" [/path/to/module/vfsinfo.ko] undefined!

如果我仍然尝试插入模块,insmod会失败并返回类似的消息。

以下是我的代码的相关部分:

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/list.h>
#include <linux/fs.h>

#define PRINT(...) printk(KERN_ALERT __VA_ARGS__)

/*
 * Print all super blocks
 */
static void vfsinfo_print_super_blocks(void) {
        struct super_block *s;

        list_for_each_entry(s, &super_blocks, s_list) {
                PRINT("%s\n", s->s_type->name);
        }
}

我做错了什么?

2 个答案:

答案 0 :(得分:1)

似乎 super_blocks 不会将 EXPORT_SYMBOL()导出到模块。参见

http://www.kernel.org/doc/htmldocs/kernel-hacking.html#symbols

了解更多信息。

答案 1 :(得分:1)

即使经过一些研究,我也找不到任何有用的list_head或为内核模块导出的函数。由于这个项目应该只是帮助我学习VFS数据结构,所以我决定创建一个指向struct list_head的指针,并将地址分配给“真实”list_head super_blocks

为此,我首先在System.map文件中查找地址。

$ grep super_blocks /boot/System.map-2.6.36
ffffffff81a22650 D super_blocks

然后我设置了list_head并开始使用它:

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/list.h>
#include <linux/fs.h>

#define PRINT(...) printk(KERN_ALERT __VA_ARGS__)

/*
 * Print all super blocks
 */
static void vfsinfo_print_super_blocks(void) {
        struct list_head *super_blocks = 0xffffffff81a22650;
        struct super_block *s;

        list_for_each_entry(s, super_blocks, s_list) {
                PRINT("%s\n", s->s_type->name);
        }
}

现在我可以访问我的所有超级块:)

[ 1218.356475] sysfs
[ 1218.357066] rootfs
[ 1218.358450] bdev
[ 1218.359600] proc
[ 1218.360368] tmpfs
[ 1218.361612] sockfs
[ 1218.362388] debugfs
[ 1218.363090] pipefs
[ 1218.363752] anon_inodefs
[ 1218.364076] devpts
[ 1218.365077] hugetlbfs
[ 1218.365654] mqueue
[ 1218.366459] selinuxfs
[ 1218.367060] usbfs
[ 1218.367489] ext2
[ 1218.368065] sysfs
[ 1218.369076] tmpfs

再见