Я вижу много людей, ссылающихся на интернет
arch/x86/entry/syscalls/syscall_64.tbl
для таблицы системных вызовов, это работает отлично. Но много других ссылок
/include/uapi/asm-generic/unistd.h
который обычно находится в пакете заголовков. Как приходят syscall_64.tbl
шоу,
0 common read sys_read
Правильный ответ и unistd.h
показывает,
#define __NR_io_setup 0
__SC_COMP(__NR_io_setup, sys_io_setup, compat_sys_io_setup)
И тогда это показывает __NR_read
как
#define __NR_read 63
__SYSCALL(__NR_read, sys_read)
Почему это 63, а не 1? Как мне разобраться /include/uapi/asm-generic/unistd.h
? Еще /usr/include/asm/
есть
/usr/include/asm/unistd_x32.h
#define __NR_read (__X32_SYSCALL_BIT + 0)
#define __NR_write (__X32_SYSCALL_BIT + 1)
#define __NR_open (__X32_SYSCALL_BIT + 2)
#define __NR_close (__X32_SYSCALL_BIT + 3)
#define __NR_stat (__X32_SYSCALL_BIT + 4)
/usr/include/asm/unistd_64.h
#define __NR_read 0
#define __NR_write 1
#define __NR_open 2
#define __NR_close 3
#define __NR_stat 4
/usr/include/asm/unistd_32.h
#define __NR_restart_syscall 0
#define __NR_exit 1
#define __NR_fork 2
#define __NR_read 3
#define __NR_write 4
Может ли кто-нибудь сказать мне разницу между этими unistd
файлами. Объясните как unistd.h
работает? И какой лучший способ найти таблицу системных вызовов?
tux
вызове ).У меня есть страница, которая перечисляет все системные вызовы для каждой поддерживаемой архитектуры Linux:
https://fedora.juszkiewicz.com.pl/syscalls.html
источник
63
read
вarm64
, 0read
вx86_64
Номера системных вызовов различны для каждой архитектуры.
Номера arm64, например, определены в:
include/uapi/asm-generic/unistd.h
это показывает, что 63, см. Также: /reverseengineering/16917/arm64-syscalls-table/18834#18834Как объясняется в этом ответе, я думаю, что include / uapi / asm-generic / unistd.h является более новой попыткой объединения номеров системных вызовов во всех арках.
Но так как числа системных вызовов не могут изменяться, чтобы не нарушать API системных вызовов, старые архивы до этой попытки объединения сохранили старые числа.
Этот вопрос требует автоматического способа получения полного списка системных вызовов, включая параметры: /programming/6604007/how-can-i-get-a-list-of-linux-system-calls-and- число-арг-они-бери автоматизац
strace
исходный кодЯ доверяю этому инструменту, и они хранят свои данные в чистоте
linux/
, например:Заметьте, что aarch64 - это архностный
#include
агностик, о64/syscallent.h
котором я упоминал ранее.Эти таблицы содержат количество аргументов, но не фактические типы аргументов, мне интересно, где
strace
их кодирует.источник
Этот ответ не будет касаться
asm-generic
версииunistd.h
, потому что ничего не включает в себя. 1Как отмечено в
syscalls(2)
:То есть правильные номера системных вызовов будут найдены в
/usr/include/asm/unistd.h
. Теперь в типичной системе x86 это будет просто включать один изasm/unistd_*.h
файлов в зависимости от цели.Номера системных вызовов, подходящих для 64-разрядной программы, включены
asm/unistd_64.h
, а номера для 32-разрядной программыasm/unistd_32.h
(или почти эквивалентный_x32.h
вариант). Они отличаются друг от друга, потому что 32- и 64-разрядные архитектуры, по сути, совершенно разные операционные системы. Они используют один и тот же набор системных вызовов, но не в одном и том же порядке по разным причинам.У большинства из них также есть обертки на языке C, поэтому вам редко придется использовать их
syscall(2)
напрямую.1 А потому что я не знаю для чего это.
источник
Чтобы добавить все отличные ответы, есть утилита,
ausyscall
которая может быть использована для перечисления всех системных вызовов и их целочисленных отображений для конкретной архитектуры.например:
источник