Что произойдет, если вы используете 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-битные указатели?

Ответы на вопрос(1)

Ваш ответ на вопрос