从MS‑DOS开始,我知道使用中断的系统调用。在旧论文中,我看到了int 80h
有关在Linux上调用系统功能的参考。从现在开始已有很长时间了,我知道int 80h
该syscall
指令已被弃用。但是我无法在我的32位计算机上运行它。
该syscall
指令仅在64位平台上使用吗?Linux不使用32位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
,但是它以相同的方式崩溃。
在进行一些Web搜索之后,我进入了StackOverflow上的另一个主题:Linux通过sysenter tutorial调用系统调用。它说,建议的调用系统的方法既不使用int 80h
也不syscall
不是sysenter
,而是linux-gate.so
。
仍然存在有关崩溃和核心转储的问题。我最后的猜测是,尽管syscall
或sysenter
指令都可作为CPU指令使用,但可能是Linux内核在确定它在给定的硬件平台上没有真正用处时才没有正确设置此“入口点”。
似乎在32位平台上,sysenter
或者syscall
可能始终可用,但仅在64位平台上可用。
尽管我感到这个问题可以回答我的问题,但我仍然欢迎提供更多材料,例如上述猜测的权威参考。
-更新-
至少,我可以找到证实以上内容的方法。那仍然不是权威参考,但我相信它似乎可以信任。
调用系统调用的首选方法是由内核在引导时确定的,显然,此框使用sysenter。
另外,从另一个来源获得一个样本FASM汇编源(如果使用NASM,则需要一些翻译),它可以通过linux-gate.so
以下方法调用系统函数:在Assembly中找到linux-gate.so.1。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句