从MS-DOS开始,我知道使用中断的系统调用.在旧文章中,我看到引用int 80h来调用
Linux上的系统函数.由于现在相当长的一段时间,我知道int 80h已被弃用而不支持syscall指令.但我不能让它在我的32位机器上工作.
这个问题
syscall指令只能在64位平台上使用吗? 32位Linux不使用系统调用吗?
样品测试
在我的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,但它以同样的方式崩溃.
解决方法
经过一些网络搜索,我在StackOverflow:
Linux invoke a system call via sysenter tutorial上找到了另一个主题.它说调用系统的推荐方法既不使用int 80h也不使用syscall也不使用sysenter,而是使用linux-gate.so.
仍然是关于崩溃和核心转储的问题.我的猜测最后是虽然系统调用或sysenter指令都可用作cpu指令,但可能是Linux内核在确定它在给定硬件平台上并不真正有用时,不能正确设置这个“入口点”.
似乎32位平台,sysenter或系统调用可用,而它始终可用,仅在64位平台上可用.
虽然我觉得这回答了我的问题,但我仍然欢迎更多的材料,比如我上面猜测的权威参考.
– 更新 –
至少,我可以找到确认上述内容.这仍然不是一个权威的参考,但我相信它似乎足够可信.
The preferred way of invoking a system call is
determined by the kernel at boot time,and
evidently this Box uses sysenter.
此外,从另一个来源,一个示例FASM汇编源(如果您使用NASM需要一些翻译),通过linux-gate.so:Finding linux-gate.so.1 in Assembly 调用系统函数.