Наиболее авторитетный и полный источник документации:
man 2 syscall_name # Раздел 2 специально для системных вызовов
Примеры:
man 2 open
man 2 read
man 2 clone
Особенности:
Можно найти точное определение syscall:
grep -r "SYSCALL_DEFINE.*open" /usr/src/linux/include/ /usr/src/linux/kernel/
Ключевые файлы:
/usr/include/asm/unistd.h
- номера системных вызовов/usr/include/linux/syscalls.h
- объявления# Список всех системных вызовов для текущей архитектуры
cat /usr/include/asm/unistd_64.h
# Таблица syscall в работающем ядре
sudo cat /proc/kallsyms | grep sys_call_table
Практический анализ работы syscall:
strace -e trace=open,read ls -l # Показывает только указанные вызовы
strace -c ls -l # Статистика по использованию syscall
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
git grep "SYSCALL_DEFINE.*read"
tldr
- упрощенные примеры:
tldr strace
Использование GDB для отладки:
gdb -q -ex "catch syscall open" -ex "run" ./my_program
# Поиск документации по ключевому слову
apropos "file open"
# Информация о конкречном syscall
whatis open
Посмотреть man page:
man 2 open
Найти реализацию в ядре:
git grep "SYSCALL_DEFINE.*open"
Просмотреть вызовы в реальной программе:
strace -e open ls -l
Проверить номера syscall:
grep __NR_open /usr/include/asm/unistd_*.h
Основные источники:
man 2 syscall
- первое место для проверкиПрактические инструменты:
strace
- анализ реального использованияgdb
- отладка на уровне syscallДля DevOps специалиста:
Все эти методы вместе дают полное представление о любом системном вызове в Linux.