无法从内核模块访问 super_blocks 列表:未定义!

发布于 2024-10-18 02:35:51 字数 800 浏览 4 评论 0原文

我正在尝试编写一个内核模块,它打印有关 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);
        }
}

我做错了什么?

I'm trying to write a kernel module, which prints some information about the objects in the VFS subsystem. That way I want to learn how the VFS works and what structures it uses.

However, I can't manage to iterate the super_blocks list, because of this compiler warning:

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

If I still try to insert the module, insmod fails and returns a similar message.

Here is the relevant part of my code:

#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);
        }
}

What am I doing wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

城歌 2024-10-25 02:35:51

似乎 super_blocks 没有通过 EXPORT_SYMBOL() 导出到模块。请参阅

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

了解更多信息。

It seems super_blocks is not exported with EXPORT_SYMBOL() to modules. See

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

for more information.

沒落の蓅哖 2024-10-25 02:35:51

即使经过一些研究,我也找不到任何有用的 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

再见

Even after some research I couldn't find any helpful list_head or function that is exported for kernel modules. Since this project should just help me to learn the VFS data structures, I decided to create a pointer to a struct list_head and assign it the address to the "real" list_head super_blocks.

For this purpose I first looked up the address in the System.map file.

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

Then I set up my list_head and started working with it:

#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);
        }
}

Now I am able to access all my super blocks :)

[ 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

Bye

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文