32位Linux上的Syscall或sysenter?

前端之家收集整理的这篇文章主要介绍了32位Linux上的Syscall或sysenter?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
从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位平台上可用.

虽然我觉得这回答了我的问题,但我仍然欢迎更多的材料,比如我上面猜测的权威参考.

– 更新 –

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

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:@L_301_3@调用系统函数.

猜你在找的Linux相关文章