С MS-DOS я знаю вызов системы с использованием прерываний. В старых документах я ссылался на int 80h
для вызова системных функций в Linux. Поскольку довольно давно я знаю, что int 80h
устарел в пользу инструкции syscall
. Но я не могу заставить его работать на моей 32-битной машине.Syscall или sysenter на 32 битах Linux?
Вопрос
ли syscall
инструкция будет использоваться только на 64 битных платформ? Не использует ли 32 бит Linux syscall
?
Опытный образец
На моих 32 бит Linux (Ubuntu Precise), эта программа завершается с дампом памяти:
global _start
_start:
mov eax, 4 ; 4 is write
mov ebx, 1 ; 1 is stdout
mov ecx, message ; address of string
mov edx, length ; number of bytes
syscall
mov eax, 1 ; 1 is exit
xor ebx, ebx ; return code 0
syscall
message:
db 10,"Hello, World",10,10
length equ $ - message
Я попытался с sysenter
вместо syscall
, но он терпит крах так же.
Возможный дубликат [Что лучше «int 0x80» или «syscall»?] (http://stackoverflow.com/questions/12806584/what -is-better-int-0x80-or-syscall) – Michael
Существует действительно что-то связанное, [здесь] (http://stackoverflow.com/a/12806910/279335), но которое не отвечает в очередь Stion. Он говорит, что «syscall» недоступен в 32-битном режиме процессоров Intel, но ассемблер скомпилировал его в режиме 32 бит; либо утверждение неясно, либо неверно. Затем я получаю ядро-дамп из-за нелегальной инструкции, но эта инструкция доступна для всех процессоров Intel, начиная с Pentium II, а моя намного выше этого. Он упоминает 'sysenter', который я попытался с тем же результатом. Во всяком случае, я никогда не видел упоминания 'sysenter' в Linux ABI, только' int 80h' или 'syscall'. – Hibou57
Ну, в соответствии с «[Системные вызовы (wiki.osdev.org)] (http://wiki.osdev.org/System_Calls)», 'syscall' является эквивалентом AMD Intel' sysenter'. В нем говорится: «* На процессоре Intel, начиная с Pentium II, появилась новая пара инструкций sysenter/sysexit. Он позволяет быстрее переключиться из режима пользователя в режим ядра, ограничив накладные расходы на изменение режима. ** Аналогичная пара команд была создана AMD: Syscall/Sysret **. Однако поведение этих инструкций отличается от поведения Intel. * « – Hibou57