Как получить список системных вызовов, которые в ядре Linux есть?

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Аватара пользователя
жучара
Сообщения: 1188
ОС: Debian 12

Как получить список системных вызовов, которые в ядре Linux есть?

Сообщение жучара »

Друзья! Я просто написал по одной книжке системный вызов "Hello, world!", собрал ядро вроде как без ошибок, установил, перезагрузился, а вызвать системный вызов не могу. Получается, мне нужно узнать, он вообще там есть, системный вызов, который я написал?

Гугление даёт какие-то списки, типа вот этого
https://filippo.io/linux-syscall-table/

Да ну понятно, что это берётся документация, переиначивается и показывается, какие вызовы ДОЛЖНЫ БЫТЬ согласно чему-то там, а не какие ЕСТЬ.

...Либо предлагаются какие-то монструальные варианты
https://stackoverflow.com/questions/17652555/where-is-the-system-call-table-in-linux-kernel

Я не знаю то это или не то, но я вижу написание системного вызова... Короче, я свой-то найти не могу, а мне ещё один написать предлагают.

А хочется просто список системных вызовов, которые в загруженном ядре есть. Ну, например, модули же можно? Можно:

Shell

$ sudo lsmod
...
$
Ну и системные вызовы должно быть можно. Наверное. Debian 12. Ядро у меня такое:

Shell

$ uname -r
7.3.0-rc5
$
Спасибо, кто откликнется.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1188
ОС: Debian 12

Re: Как получить список системных вызовов, которые в ядре Linux есть?

Сообщение жучара »

Ну что, ребята, может, есть у кого-нибудь какие-нибудь соображения? Я пытался натравить nm и readelf на ядро- так оно пишет так:

Shell

$ nm arch/x86/boot/bzImage
nm: h_b_c/linux/arch/x86/boot/bzImage: нет символов
$
$
$ readelf -s arch/x86/boot/bzImage
readelf: Ошибка: Не ELF-файл — он содержит неверные magic-байты в начале
$
arch/x86/boot/bzImage это и есть ядро, сразу после сборки.

Shell

$ file h_b_c/linux/arch/x86/boot/bzImage
h_b_c/linux/arch/x86/boot/bzImage: Linux kernel x86 boot executable bzImage, version 7.3.0-rc5 (user@debian) #1 SMP PREEMPT_DYNAMIC Sun Oct 4 17:21:58 +05 2026, RO-rootFS, swap_dev 0X8, Normal VGA
$
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1188
ОС: Debian 12

Re: Как получить список системных вызовов, которые в ядре Linux есть?

Сообщение жучара »

Вот, казалось бы, утилита ausyscall, которая выводит список системных вызовов. Но вот моего она не находит. Вот вызов моего рабочего системного вызова (хелловорд простой):

Shell

$ cat foo.c
/* foo.c */
#define _GNU_SOURCE

#include <stdio.h>
#include <unistd.h>

// Thse is not part of POSIX!
#include <sys/syscall.h>

int main(int argc, char** argv) {
char str[20] = "world";
char message[64] = "";

// Call the hello world system call
int ret_val = syscall(999, str, 6 , message, 64);
if (ret_val < 0) {
printf("[ERR] Ret val: %d\n", ret_val);
return 1;
}
printf("Message: %s\n", message);
return 0;
}
$
Вот обратите внимание, на его номер 999 А как он реализован, я сейчас пока писать не буду, достаточно того, что он есть в ядре, ядро с ним собрано и с ним работает. И вызов работает:

Shell

$ gcc foo.c
$ ./a.out
Message: Hello world!
$
Всё. Ну так сечас бы ausyscall-у найти это вызов и вопрос решён. Так нет же. По номеру его искать, я так понимаю, бесполезно, ибо все номера перепутаны. Ну хоть по имени. Вот его имя:

Shell

$ cat arch/x86/entry/syscalls/syscall_64.tbl | grep -v "^#" | tail -n 1
999 64 aaabbbrtr_0 sys_aaabbbrtr_0
$
Да, такое странное имя, зато уникальное. Ищем по имени:

Shell

$ ausyscall --dump | grep aaa
$
В общем, ausyscall показывает, что системного вызова aaabbbrtr_0 нет Но он в ядре есть и даже вызывается. Теперь уже надо ставить вопрос, не как получить список системных вызовов, которые в ядре Linux есть, а как НА САМОМ ДЕЛЕ получить список системных вызовов, которые в ядре Linux есть...
Я просто читаю маны.
Спасибо сказали: