在Linux上的32位代码中,哪个更好的“ int 0x80”或“ syscall”更好?

亚历克斯:

我研究了Linux内核,发现对于x86_64体系结构,中断int 0x80不适用于调用系统调用1

对于i386体系结构(32位x86用户空间),更可取的是:syscall或者int 0x80为什么?

我使用Linux内核版本3.4。


脚注1:int 0x80在某些情况下确实可以在64位代码中工作,但是从不建议这样做。如果以64位代码使用32位int 0x80 Linux ABI,会发生什么情况?

PawełDziepak:
  • syscall是在上进入内核模式的默认方式x86-64该指令在Intel处理器的 32位操作模式下不可用
  • sysenter是最常用于以32位操作模式调用系统调用的指令。它类似于syscall,但是使用起来有点困难,但这是内核的关注点。
  • int 0x80 是调用系统调用的传统方式,应避免使用。

调用系统调用的首选方法是使用vDSO,这是在每个进程地址空间中映射的一部分内存,它可以更有效地使用系统调用(例如,在某些情况下完全不进入内核模式)。与传统int 0x80方式相比,vDSO还可以处理更困难的问题syscall处理sysenter指令。

另外,看到这个这个

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果以64位代码使用32位int 0x80 Linux ABI,会发生什么情况?

OS X上的Nasm用子例程替换int 0x80

这个 x86 Hello World 使用来自 _start 的 32 位 int 0x80 Linux 系统调用的解释是什么?

在64位Linux上使用中断0x80

int 0x21 和 int 0x80 有什么区别?

您怎么称呼“ int 0x80”后面的调用约定?

在main的末尾跳转不使用int 0x80执行

如何将 0x80 转换为 7 位可变长度整数?

为什么((unsigned char)0x80)<< 24的符号扩展到0xFFFFFFFF80000000(64位)?

更好的int偏斜

返回vector <int>或int *更好吗?

UnicodeDecodeError: 'utf-8' 编解码器无法解码位置 0 中的字节 0x80:起始字节无效

Gensim W2V - UnicodeDecodeError: 'utf-8' 编解码器无法解码位置 0 中的字节 0x80:起始字节无效

在Java中通过i2c将0x80或-128写入寄存器时有区别吗

获取“ cp950”编解码器的Unicode解码错误,无法解码位置2516中的字节0x80:非法的多字节序列

OR 0x80是做什么的?

如果是位字段,则使用unsigned char或unsigned int哪个更好,为什么?

使用`Int((n + 1)/ 2)`,`round(Int,(n + 1)/ 2)或`Int((n + 1)// 2)哪个更好?

将对象转换为int的更好方法

对每个 for 循环使用相同的 int 是否更好?

如何将32位参数传递给x86_64上的Linux syscall?

表检测任务(TableBank & Detectron):UnicodeDecodeError:“ascii”编解码器无法解码位置 0 中的字节 0x80:序号不在范围内(128)

UnicodeDecodeError: 'utf-8' 编解码器无法解码位置 0 中的字节 0x80:读取文本文件时的起始字节无效

为什么对于f(long),f(double)比f(long,int = 0)更好的匹配?

x <5或5> x哪个更好?

number(x)或parseFloat(x)哪个更好?

在同一代码块中多次访问列表-更好的方法吗?

将RGB颜色存储在MySQL中。作为char或int更好?

在32位Linux上是Syscall还是sysenter?