Выполнение системных вызовов
Если прикладное приложение выполняет системный вызов, запускается программное прерывание/исключение. Как я могу увидеть исходный код для генерации программного прерывания?
Ответы
Ответ 1
Объясняется в Руководство по сборке Linux. И вы должны прочитать wikipedia syscall (а также о VDSO), а также intro (2) и syscalls (2) страниц. См. Также этот ответ и этот. Смотрите также внутри Gnu Libc и musl-libc источник код. Узнайте также, как использовать strace
, чтобы узнать, какие системные вызовы сделаны с помощью данной команды или процесса.
См. также соглашения о вызовах и спецификацию Application Binary Interface, относящиеся к вашей системе. Для x86-64 это здесь.
Ответ 2
давно, есть ловушка int 0x80
для входа в ядро, но в настоящее время sysenter
является предпочтительным.
вы можете получить код путем демпинга vsyscall
, который автоматически преобразуется в каждый процесс с помощью ядра.
$ cat /proc/self/maps
blah blah blah
...
blah blah blah
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
для получения дополнительной информации проверьте эту статью
Ответ 3
Прерывание программного обеспечения может быть инициировано с помощью инструкции сборки Intel x86 int n
, где n
- номер прерывания. Syscall - это особый случай прерывания программного обеспечения; вы можете вручную выполнить syscall с помощью
mov eax, m
int 0x80
где m
следует заменить номером прерывания. Ниже перечислены списки 32-разрядные номера системного вызова и 64-разрядные номера системных вызовов, которые связаны с онлайн файлами для каждой функции. Вам также необходимо передать параметры в syscall через другие регистры (ebx
, ecx
и т.д.), И вы можете узнать больше об этом здесь.
Это самый общий способ сделать syscalls, потому что он не зависит от внешних библиотек, таких как libc, и вы можете реализовать это в C/С++, если вам нужно использовать встроенную сборку.