有什么更好的“INT 0x80”或“系统调用”?
我研究了Linux内核,发现对于x86_64
体系结构来说,中断int 0x80
不起调用系统调用的作用。
问题是:在x86
架构的情况下什么是更可取的syscall
或int 0x80
,为什么?
编辑 :我使用内核3.4
-
syscall
是在x86-64
上进入内核模式的默认方式。 在英特尔处理器上,该指令在32位操作模式下不可用。 -
sysenter
是最常用于在32位操作模式下调用系统调用的指令。 它与syscall
类似,但是有点难以使用,但这是内核的关注点。 -
int 0x80
是调用系统调用的传统方式,应该避免。
调用系统调用的最佳方式是使用VDSO,这是映射到每个进程地址空间中的一部分内存,允许更高效地使用系统调用(例如,在某些情况下根本不进入内核模式)。 与传统的int 0x80
方式相比,VDSO还处理更加困难,处理syscall
或sysenter
指令。
另外,看到这个和这个 。
我的答案在这里涵盖你的问题。
在实践中,最近的内核正在实现VDSO ,特别是dynamic优化系统调用(内核将VDSO设置为当前处理器的最佳代码)。 所以你应该使用VDSO,并且你最好使用libc提供的接口来获得现有的系统调用。
请注意,AFAIK是简单系统调用的重要组成部分,从用户空间到内核和后端。 因此,对于某些系统调用(可能是gettimeofday
, getpid
…),VDSO甚至可能会避免(并且在技术上可能避免做一个真正的系统调用)。 对于大多数系统调用(如open
, read
, send
, mmap
….),系统调用的内核成本足够大,可以改善用户空间到内核空间的转换(例如,使用SYSENTER
或SYSCALL
机器指令代替INT
)微不足道。
更改之前请注意: 系统调用号码在执行0x80或系统调用时会有所不同 ,例如,sys_write为4,0x80和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进行系统调用
int 0x80
是一个更好的术语来表明其系统调用内核告诉它做一些事情。
意义和解释是可以互换的,“做一个系统调用”或“发出int 80h”。
DOS的日子并没有什么不同:
- 调用int 21h来让DOS在AX寄存器和可选的ES:DX寄存器对上执行某些操作,
- int 13h是BIOS硬盘处理程序。
- int 10h是EGA / VGA屏幕。
- int 09h是键盘处理程序。
这里的常见主题是,当调用一个中断/系统调用时,内核检查寄存器的状态以查看需要什么types的系统调用。 例如,通过查看eax
寄存器,并确定要执行的操作,内部上下文切换到内核空间,执行过程和上下文切换回用户空间,并返回选项返callback用结果,即是成功还是失败?