在32位Linux上是Syscall还是sysenter?

Hibou57:

从MS‑DOS开始,我知道使用中断的系统调用。在旧论文中,我看到了int 80h有关在Linux上调用系统功能的参考从现在开始已有很长时间了,我知道int 80hsyscall指令已被弃用但是我无法在我的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,但是它以相同的方式崩溃。

Hibou57:

在进行一些Web搜索之后,我进入了StackOverflow上的另一个主题:Linux通过sysenter tutorial调用系统调用它说,建议的调用系统的方法既不使用int 80h也不syscall不是sysenter,而是linux-gate.so

仍然存在有关崩溃和核心转储的问题。我最后的猜测是,尽管syscallsysenter指令都可作为CPU指令使用,但可能是Linux内核在确定它在给定的硬件平台上没有真正用处时才没有正确设置此“入口点”。

似乎在32位平台上,sysenter或者syscall 可能始终可用,但仅在64位平台上可用。

尽管我感到这个问题可以回答我的问题,但我仍然欢迎提供更多材料,例如上述猜测的权威参考。

-更新-

至少,我可以找到证实以上内容的方法。那仍然不是权威参考,但我相信它似乎可以信任。

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

调用系统调用的首选方法是由内核在引导时确定的,显然,此框使用sysenter。

另外,从另一个来源获得一个样本FASM汇编源(如果使用NASM,则需要一些翻译),它可以通过linux-gate.so以下方法调用系统函数在Assembly中找到linux-gate.so.1

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章