无法从内核模块访问 super_blocks 列表:未定义!
我正在尝试编写一个内核模块,它打印有关 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
似乎 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.
即使经过一些研究,我也找不到任何有用的
list_head
或为内核模块导出的函数。由于这个项目应该只是帮助我学习 VFS 数据结构,因此我决定创建一个指向 struct list_head 的指针,并将其分配给“真实”list_head super_blocks 的地址。 。为此,我首先在 System.map 文件中查找地址。
然后我设置了
list_head
并开始使用它:现在我可以访问我的所有超级块了:)
再见
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 astruct 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.Then I set up my
list_head
and started working with it:Now I am able to access all my super blocks :)
Bye