2016-10-31 19 views
3

Я выполняет системный вызов на OS X (32-битный), как это:Почему для BSD-систем требуется подчинение, 4 при выполнении системного вызова?

push 123 
mov eax, 1 
sub esp, 4 
int 0x80 

И я не совсем понимаю, что sub esp, 4 разрыв.

Я где-то читал, что BSD и его производные всегда имеют этот пробел, но не могли найти объяснения, почему.

Моя первая мысль заключалась в выравнивании стека, но это не так, поскольку эта строка встречается повсюду, и насколько я знаю, для OS X требуется 16-байтовое выравнивание стека (что здесь не так).

Вы знаете, что скрывается за необходимостью sub esp, 4 или можете указать мне ресурсы, которые описывают его правильно?

+0

Обоснование обсуждается здесь: https://www.freebsd.org/doc/en/books/developers-handbook/book.html#x86-system-calls –

+1

Это потому, что вы ожидаете вызова функции, и это пространство для обратного адреса. Позвольте мне найти дубликат. – Jester

+0

@MichaelPetch Я прочитал тот же самый документ, но тот факт, что это замена 'call', не совсем объясняет, почему этот' call' необходим в первую очередь – mewa

ответ

3

(вики сообщества, потому что я просто суммируя комментарии)

BSD делает это, чтобы сделать LibC функции оболочки для системных вызовов более эффективными, потому что они могут просто сделать int 0x80 без копирования арг вокруг. Он оставляет место для обратного адреса, нажатого CALL, в функцию обертки.

Это стандартная система Unix/Linux для системных вызовов, таких как read(2), чтобы фактически быть функциями обертки библиотеки вокруг вызова ядра, а не макросами, которые расширяются до inline-asm.


Linux решает эту проблему по-другому: передавая все syscall args в регистры. Я предполагаю, что это означает, что 32-разрядные функции-обертки должны загружать все аргументы из стека, но по крайней мере они не должны быть сохранены и перечитаны ядром.

Системный вызов x86-64 ABI гораздо более совместим с соглашением о вызове функции: необходим только один номер mov r10, rcx, поскольку соглашение о вызове функции System V передает аргументы в регистры (и регистры syscall выбираются так, чтобы соответствовать им насколько это возможно, за исключением того, что the SYSCALL instruction itself destroys RCX and R11, so the kernel can't see the original values.)

См. wiki для для получения дополнительной информации о том, что на самом деле существуют соглашения о вызовах, и ссылки на ABI.

+0

Я знаю о других соглашениях о вызовах, мне просто нужно было пояснить пробел в 1 стрелке;) Спасибо за ссылки так или иначе! – mewa

+1

@mewa: Я надеюсь, что некоторые будущие читатели, кроме вас, выиграют в какой-то момент. :) –

 Смежные вопросы

  • Нет связанных вопросов^_^