Что произойдет, если вы используете 32-битный int 0x80 Linux ABI в 64-битном коде?
int 0x80
в Linux всегда вызывает 32-битный ABI, независимо от того, из какого режима он вызывается: args inebx
, ecx
, ... и номера системных звонков от/usr/include/asm/unistd_32.h
. (Или вылетает на 64-битных ядрах, скомпилированных безCONFIG_IA32_EMULATION
).
64-битный код должен использоватьsyscall
, с номерами звонков от/usr/include/asm/unistd_64.h
и аргументы вrdi
, rsi
и т. д. См. Каковы соглашения о вызовах для системных вызовов UNIX и Linux на i386 и x86-64. Если ваш вопрос был помечен как дубликат этого, см. эту ссылку для получения подробной информации о том, как выдолже делать системные вызовы в 32- или 64-битном коде. Если хочешь понять, что именно произошло, продолжай читать.
syscall
системные вызовы быстрее, чемint 0x80
системные вызовы, поэтому используйте родной 64-битныйsyscall
если вы не пишете машинный код полиглота, который выполняется так же, как 32- или 64-битный. sysenter
всегда возвращается в 32-битном режиме, поэтому он не используется в 64-битном пользовательском пространстве, хотя это действительная инструкция x86-64.)
Связанный: Полное руководство по системным вызовам Linux (на x86) как сделатьint 0x80
илиsysenter
32-битные системные вызовы илиsyscall
64-битные системные вызовы или вызов vDSO для «виртуальных» системных вызовов, таких какgettimeofday
. Плюс справочная информация о том, что все системные вызовы.
С помощьюint 0x80
позволяет написать что-то, что будет собираться в 32- или 64-битном режиме, так что это удобно дляexit_group()
в конце микробенчмарка или еще чего-нибудь.
Текущие PDF-файлы официальных документов psABI i386 и x86-64 System V, которые стандартизируют соглашения о вызовах функций и системных вызовов, связаны сhttps: //github.com/hjl-tools/x86-psABI/wiki/X86-psAB.
Смотри X86 tag wiki для руководств для начинающих, руководств по x86, официальной документации и руководств / ресурсов по оптимизации производительности.
Но так как люди продолжают публиковать вопросы с кодом, который используетint 0x80
в 64-битном коде или случайно сборка 64-битных двоичных файловнтересно, @ из источника, написанного для 32-битной версиичтов точк случается в современной Linux?
Делаетint 0x80
сохранить / восстановить все 64-битные регистры? Обрезает ли он какие-либо регистры до 32-битного? Что произойдет, если вы передадите аргументы-указатели с ненулевыми верхними половинами?
Сработает ли, если вы передадите 32-битные указатели?