自从 MS-DOS 时代开始,我就知道可以使用中断来调用系统。在早期的文献中,我看到过在 Linux 上调用系统函数需要使用“int 80h”的参考资料。现在已经有相当长一段时间了,我知道“int 80h”已被“syscall”指令取代了。但是我在我的32位机器上无法让它工作。
问题是,是否只有64位平台才能使用“syscall”指令?32位的 Linux 是否也使用“syscall”?
在我的32位 Linux(Ubuntu Precise)上,运行此程序会导致核心转储。
问题是,是否只有64位平台才能使用“syscall”指令?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
,但它以相同的方式崩溃。
sysenter
,我尝试过,结果相同。无论如何,在Linux ABI中我从未见过关于sysenter
的任何提及,只有int 80h
或syscall
。 - Hibou57syscall
是AMD版本的Intelsysenter
。它说:“*在英特尔CPU上,从Pentium II开始,出现了一对新指令sysenter/sysexit。它允许更快地从用户模式切换到内核模式,通过限制改变模式的开销。AMD创建了类似的指令对:Syscall/Sysret。但是这些指令的行为与英特尔的不同。” - Hibou57