在 Linux 上的 32 位代码中,“int 0x80”和“syscall”哪个更好?
- 2024-10-11 08:36:00
- admin 原创
- 75
问题描述:
我研究了 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,会发生什么情况?
解决方案 1:
syscall
是进入内核模式的默认方式。此指令在Intel 处理器的x86-64
32 位操作模式下不可用。sysenter
是 32 位操作模式下最常用于调用系统调用的指令。它与 类似syscall
,但使用起来稍微困难一些,但这是内核关心的问题。int 0x80
是调用系统调用的一种传统方式,应该避免。
调用系统调用的首选方式是使用vDSO,它是映射到每个进程地址空间的一部分内存,可以更有效地使用系统调用(例如,在某些情况下根本不进入内核模式)。与传统方式相比int 0x80
, vDSO 还可以处理更困难的syscall
指令sysenter
。
另请参阅这个和这个。
解决方案 2:
我的回答涵盖了您的问题。
实际上,最近的内核正在实现VDSO,特别是为了动态优化系统调用(内核将 VDSO 设置为最适合当前处理器的某些代码)。因此,您应该使用 VDSO,并且对于现有的系统调用,最好使用 libc 提供的接口。
请注意,据我所知,简单系统调用的很大一部分成本是从用户空间到内核再返回。因此,对于某些系统调用(可能是gettimeofday
,getpid
...),VDSO 甚至可能避免这种情况(并且从技术上讲可能避免执行真正的系统调用)。对于大多数系统调用(如,,,open
... ),系统调用的内核成本足够大,以至于对用户空间到内核空间转换的任何改进(例如使用或机器指令而不是)都微不足道。read
`sendmmap
SYSENTERSYSCALL
INT`
解决方案 3:
更改之前请注意:执行 0x80 或 syscall 时系统调用号会有所不同,例如 sys_write 在 0x80 时为 4,而在 syscall 时为 1。
http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html适用于 32 位或 0x80
http://blog.rchapman.org/post/36801038863/linux-system-call-table-for-x86-64适用于系统调用
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件