Выполнение системных вызовов

Если прикладное приложение выполняет системный вызов, запускается программное прерывание/исключение. Как я могу увидеть исходный код для генерации программного прерывания?

Ответ 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/С++, если вам нужно использовать встроенную сборку.