Смущает sys_stat, системный вызов sys_statfs работаетLinux

Ответить Пред. темаСлед. тема
Anonymous
 Смущает sys_stat, системный вызов sys_statfs работает

Сообщение Anonymous »

Я пытаюсь настроить системный вызов kprobe на stat для сбора некоторой информации. При проверке /proc/kallsyms у меня много похожих имен, и это немного сбивает с толку, какое из них мне подходит.
Я пытаюсь найти правильный системный вызов используется для получения данных, отображаемых в выводе таких команд, как stat filename или stat dir.
Сначала я попробовал __x64_sys_stat, но мои обработчики не получают называется. Затем я попробовал __do_sys_stat, __x64_sys_newstat, но ни один из обработчиков не был вызван.
Ниже приведены выходные данные /proc/kallsyms,

Код: Выделить всё

user@xubun2204:~$ cat /proc/kallsyms | grep newstat
0000000000000000 t __do_sys_newstat
0000000000000000 T __x64_sys_newstat
0000000000000000 T __ia32_sys_newstat
0000000000000000 t __do_compat_sys_newstat
0000000000000000 T __ia32_compat_sys_newstat
0000000000000000 T __x64_compat_sys_newstat
0000000000000000 d event_exit__newstat
0000000000000000 d event_enter__newstat
0000000000000000 d __syscall_meta__newstat
0000000000000000 d args__newstat
0000000000000000 d types__newstat
0000000000000000 d __event_exit__newstat
0000000000000000 d __event_enter__newstat
0000000000000000 d __p_syscall_meta__newstat
0000000000000000 d _eil_addr___x64_compat_sys_newstat
0000000000000000 d _eil_addr___ia32_compat_sys_newstat
0000000000000000 d _eil_addr___ia32_sys_newstat
0000000000000000 d _eil_addr___x64_sys_newstat
user@xubun2204:~$ cat /proc/kallsyms | grep do_stat
0000000000000000 T proc_do_static_key
0000000000000000 T do_statx
0000000000000000 t do_statfs_native
0000000000000000 t do_statfs64
user@xubun2204:~$ cat /proc/kallsyms | grep sys_stat
0000000000000000 t __do_sys_stat
0000000000000000 T __x64_sys_stat
0000000000000000 T __ia32_sys_stat
0000000000000000 T __x64_sys_statx
0000000000000000 T __ia32_sys_statx
0000000000000000 t __do_sys_statfs
0000000000000000 T __x64_sys_statfs
0000000000000000 T __ia32_sys_statfs
0000000000000000 t __do_sys_statfs64
0000000000000000 T __x64_sys_statfs64
0000000000000000 T __ia32_sys_statfs64
0000000000000000 t __do_compat_sys_statfs
0000000000000000 T __ia32_compat_sys_statfs
0000000000000000 T __x64_compat_sys_statfs
0000000000000000 T kcompat_sys_statfs64
0000000000000000 T __ia32_compat_sys_statfs64
0000000000000000 T __x64_compat_sys_statfs64
0000000000000000 d _eil_addr___ia32_sys_statx
0000000000000000 d _eil_addr___x64_sys_statx
0000000000000000 d _eil_addr___ia32_sys_stat
0000000000000000 d _eil_addr___x64_sys_stat
0000000000000000 d _eil_addr___x64_compat_sys_statfs64
0000000000000000 d _eil_addr___ia32_compat_sys_statfs64
0000000000000000 d _eil_addr___x64_compat_sys_statfs
0000000000000000 d _eil_addr___ia32_compat_sys_statfs
0000000000000000 d _eil_addr___ia32_sys_statfs64
0000000000000000 d _eil_addr___x64_sys_statfs64
0000000000000000 d _eil_addr___ia32_sys_statfs
0000000000000000 d _eil_addr___x64_sys_statfs
Затем я попробовал __x64_sys_statfs, и теперь мои обработчики вызываются!
Как я понял разницу между sys_stat и sys_statfs — это sys_stat, используемый для получения информации о файлах и каталогах, а sys_statfs — для получения информации о файловой системе.
Но в данном случае нет независимо от того, что я использую в командной строке stat (файловая система или конкретный файл или каталог), вызывается __x64_sys_statfs!
Проблема начинается, когда я хочу прочитать то, что возвращается этим системным вызовом, следует ли мне ожидать struct kstat или struct statfs?
Вот код, с помощью которого мне удается запустить обработчик kretprobe,< /p>

Код: Выделить всё

#include [*]
#include 
#include 
#include 
#include 
#include 

static struct kretprobe my_kretprobe;

static int entry_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
{
printk("entry_handler\n");
return 0;
}

static int ret_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
{
printk("ret_handler\n");
return 0;
}

static int __init my_module_init(void)
{
int ret;

my_kretprobe.kp.symbol_name = "__x64_sys_statfs";
my_kretprobe.entry_handler = entry_handler;
my_kretprobe.handler = ret_handler;
my_kretprobe.maxactive = 20;

ret = register_kretprobe(&my_kretprobe);
if (ret <  0) {
printk(KERN_INFO "register_kretprobe failed, returned %d\n", ret);
return ret;
}

printk(KERN_INFO "Kretprobe registered for __x64_sys_statfs\n");
return 0;
}

static void __exit my_module_exit(void)
{
unregister_kretprobe(&my_kretprobe);
printk(KERN_INFO "Kretprobe unregistered\n");
}

module_init(my_module_init);
module_exit(my_module_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("jelal");
MODULE_DESCRIPTION("simple kret lkm");

и Makefile,

Код: Выделить всё

obj-m += statdata.o

all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Я экспериментирую, и у меня нет какой-либо конечной цели для продукта, единственная цель — получить доступ к данным, отображаемым командой терминала stat из ядра.

В чем разница между sys_stat, sys_statfs, sys_newstat и sys_statx?
[*]Как узнать, какой системный вызов подходит для установки зонда?
[*]Какова причина того, что sys_stat не используется?
< /ul>
Спасибо

Подробнее здесь: https://stackoverflow.com/questions/787 ... call-works
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Linux»