gpt4 book ai didi

linux - 32 位 Linux 上的 Syscall 或 sysenter?

转载 作者:IT王子 更新时间:2023-10-29 00:19:37 29 4
gpt4 key购买 nike

从 MS‑DOS 开始,我就知道使用中断进行系统调用。在旧论文中,我看到引用 int 80h 来调用 Linux 上的系统函数。很长一段时间以来,我知道 int 80h 已被弃用,取而代之的是 syscall 指令。但我无法让它在我的 32 位机器上运行。

问题

syscall 指令是否只能在 64 位平台上使用? 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,但它以同样的方式崩溃。

最佳答案

经过一些网络搜索后,我在 StackOverflow 上找到了另一个主题:Linux invoke a system call via sysenter tutorial .它说调用系统的推荐方法既不是使用 int 80h 也不是 syscall 也不是 sysenter,而是 linux-gate.so

关于崩溃和核心转储的问题仍然存在。最后我的猜测是,虽然 syscallsysenter 指令可用作 CPU 指令,但可能是 Linux 内核在以下情况下没有正确设置这个“入口点”它决定它在给定的硬件平台上并不是真正有用。

似乎在 32 位平台上,sysentersyscall 可能 可用,虽然它始终可用,但仅在 64 位平台上可用。

虽然我觉得这回答了我的问题,但我仍然欢迎更多资料,比如对我上述猜测的权威引用。

-- 更新--

至少,我能找到证实上述内容的这个。这仍然不是权威引用,但我相信它似乎足够可信。

What is linux-gate.so.1? , 说:

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 .

关于linux - 32 位 Linux 上的 Syscall 或 sysenter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15598700/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com