Даже после некоторых исследований я не смог найти никакой полезной 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
Пока