Где идентификаторы системных вызовов определены для арки x86 в Linux Kernel 5.0.1? - PullRequest
1 голос
/ 14 марта 2019

Я слежу за видеоуроком по системному программированию в Linux.

Когда я дошел до раздела «Как добавить свой собственный системный вызов Linux», инструктор показывает, что все идентификаторы системных вызовов (макросы, начинающиеся с __NR) присутствуют в arch / x86 / include / asm / unistd_32.h илиunistd_64.h (в зависимости от цели).

Но в моем исходном коде (linux-5.0.1) я не вижу этих файлов, есть только один unistd.h, который не содержит идентификаторов системных вызовов.Были ли эти файлы перенесены в другое место или x86 не имеет собственной таблицы системных вызовов.

Редактировать: Я загрузил последний исходный код ядра с сайта kernel.org и пытаюсь его изменить.Я не могу найти файлы unistd_32.h и unistd_64.h в вышеуказанном месте.Нужно ли сначала что-то делать?

1 Ответ

2 голосов
/ 14 марта 2019

Arch Linux поставляется unistd_32.h и unistd_64.h in /usr/include/asm/. Просто посмотрите на эти заголовки, если вы не модифицируете ядро ​​для добавления новых системных вызовов.

<asm/unistd.h> проверяет макросы, чтобы выяснить, включено ли их в 32- или 64-битный код (и проверяет x32), и использует #include, чтобы получить правильный набор определений для цели.

В моей современной системе Arch x86-64:

$ pacman -Fo /usr/include/asm/unistd*
usr/include/asm/unistd_32.h is owned by core/linux-api-headers 4.7-1
usr/include/asm/unistd_64.h is owned by core/linux-api-headers 4.7-1
usr/include/asm/unistd.h is owned by core/linux-api-headers 4.7-1
usr/include/asm/unistd_x32.h is owned by core/linux-api-headers 4.7-1

В самом исходном коде ядра, начиная с версии 3.3, unistd_32.h для использования пользовательским пространством построен из других файлов .

https://github.com/torvalds/linux/search?q=unistd_32.h&unscoped_q=unistd_32.h находит это в arch/x86/entry/syscalls/Makefile

$(uapi)/unistd_32.h: $(syscall32) $(syshdr)
    $(call if_changed,syshdr)

Таблицы системных вызовов определены в: arch/x86/entry/syscalls/syscall_32.tbl и .../syscall_64.tbl

https://github.com/torvalds/linux/tree/6f0d349d922ba44e4348a17a78ea51b7135965b1/arch/x86/entry/syscalls

Содержимое syscall_32.tbl выглядит так:

# some comments
0   i386    restart_syscall     sys_restart_syscall     __ia32_sys_restart_syscall
1   i386    exit            sys_exit            __ia32_sys_exit
2   i386    fork            sys_fork            __ia32_sys_fork
3   i386    read            sys_read            __ia32_sys_read
...
...