有什么更好的“INT 0x80”或“系统调用”?

我研究了Linux内核,发现对于x86_64体系结构来说,中断int 0x80不起调用系统调用的作用。

问题是:在x86架构的情况下什么是更可取的syscallint 0x80 ,为什么?

编辑 :我使用内核3.4

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

调用系统调用的最佳方式是使用VDSO,这是映射到每个进程地址空间中的一部分内存,允许更高效地使用系统调用(例如,在某些情况下根本不进入内核模式)。 与传统的int 0x80方式相比,VDSO还处理更加困难,处理syscallsysenter指令。

另外,看到这个和这个 。

我的答案在这里涵盖你的问题。

在实践中,最近的内核正在实现VDSO ,特别是dynamic优化系统调用(内核将VDSO设置为当前处理器的最佳代码)。 所以你应该使用VDSO,并且你最好使用libc提供的接口来获得现有的系统调用。

请注意,AFAIK是简单系统调用的重要组成部分,从用户空间到内核和后端。 因此,对于某些系统调用(可能是gettimeofdaygetpid …),VDSO甚至可能会避免(并且在技术上可能避免做一个真正的系统调用)。 对于大多数系统调用(如openreadsendmmap ….),系统调用的内核成本足够大,可以改善用户空间到内核空间的转换(例如,使用SYSENTERSYSCALL机器指令代替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用结果,即是成功还是失败?