Вот, казалось бы, утилита
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 есть...
Я просто читаю маны.