Невозможно получить доступ к списку super_blocks из модуля ядра: не определено! - PullRequest
1 голос
/ 19 февраля 2011

Я пытаюсь написать модуль ядра, который выводит некоторую информацию об объектах в подсистеме 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 ]

1 голос
/ 27 февраля 2011

Даже после некоторых исследований я не смог найти никакой полезной list_head или функции, которая экспортируется для модулей ядра.Поскольку этот проект должен просто помочь мне изучить структуры данных VFS, я решил создать указатель на struct list_head и присвоить ему адрес для «реального» * ​​1003 *.

. Для этого я сначалапосмотрел адрес в файле 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

Пока

1 голос
/ 19 февраля 2011

Кажется, super_blocks не экспортируется с EXPORT_SYMBOL () в модули.См.

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

для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...