syscall或sybase在32位Linux上?

由于MS-DOS,我知道使用中断的系统调用。 在旧的论文中,我看到引用int 80h来调用Linux上的系统函数。 既然现在已经很长时间了,我知道int 80h已经被弃用了,而且是有利于syscall 。 但是我不能在我的32位机器上工作。

这个问题

syscall指令是否仅在64位平台上使用? Linux 32位不使用syscall吗?

样品testing

在我的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通过sysenter教程调用系统调用 。 它说调用系统的推荐方式,既不使用int 80h也不使用系统调用,也不使用linux-gate.so ,而是使用linux-gate.so

仍然是关于崩溃和核心转储的问题。 我的猜测是,尽管syscall或者sysenter指令都可以作为CPU指令使用,但是当Linux内核认为它在给定的硬件平台上并不真正有用时,Linux内核可能无法正确设置这个“入口点”。

似乎32位平台, sysentersyscall 可能是可用的,而它始终可用,只在64位平台上。

虽然我觉得这个答案是我的问题,但是我仍然欢迎更多的资料,就像我上面猜测的权威性参考资料。

– 更新 –

至少,我可以找到这确认上述。 这仍然不是一个权威的参考,但我相信似乎足够可信。

什么是linux-gate.so.1? 说:

调用系统调用的首选方式是由内核在启动时确定的 ,显然这个方框使用sysenter。

此外,从另一个来源,一个示例FASM汇编源(如果您使用NASM需要一些翻译),通过linux-gate.so调用系统函数: 在Assembly中查找linux-gate.so.1 。

英特尔手册说, syscall在兼容性(32位)模式下是无效的,所以不应该被内核使用。

这似乎是一个英特尔的限制,但是:AMD没有,但肯定Linux必须支持英特尔:-) https://stackoverflow.com/a/29784932/895245

sysenter似乎是今天做的最好的方法,因为它比int 0x80快,但它应该通过VDSO间接使用,如在内联汇编(x86 / amd64 linux)中如何通过sysenter调用系统调用所解释的那样?