什么是更好的“ int 0x80”或“ syscall”?

问题描述 投票:56回答:4

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

((编者注:并非完全正确,在某些情况下它确实有效,但从不推荐。What happens if you use the 32-bit int 0x80 Linux ABI in 64-bit code?


对于i386体系结构(32位x86用户空间),更优选syscallint 0x80,为什么?

EDIT:我使用内核3.4

linux assembly x86 system-calls
4个回答
73
投票
  • syscall是在x86-64上进入内核模式的默认方法。该指令在32位操作模式下不可用在Intel处理器上>。
  • sysenter是最常用于以32位操作模式调用系统调用的指令。它类似于syscall,虽然使用起来有点困难,但这是内核需要考虑的问题。
  • int 0x80是调用系统调用的传统方法,应避免使用。
  • 调用系统调用的首选方法是使用VDSO,它是映射在每个进程地址空间中的一部分内存,可以更有效地使用系统调用(例如,在某些情况下根本不进入内核模式)。与传统的int 0x80方式相比,VDSO还可以处理syscallsysenter指令。

    也请参见thisthis

我的答案here涵盖了您的问题。

实际上,最近的内核正在实现VDSO,特别是为了动态优化系统调用(内核将VDSO设置为最适合当前处理器的某些代码)。因此,您应该使用VDSO,对于现有的系统调用,最好使用libc提供的接口。

[注意,AFAIK是简单系统调用成本的很大一部分是从用户空间到内核再到内核。因此,对于某些系统调用(可能是gettimeofdaygetpid ...),VDSO甚至可以避免(并且从技术上讲,可以避免进行真正的系统调用)。对于大多数系统调用(例如openreadsendmmap...。),系统调用的内核成本足够大,足以改善用户空间到内核空间的过渡(例如,使用SYSENTERSYSCALL机器指令,而不是INT)无关紧要。

更改前请注意:系统调用号不同

,当执行0x80或syscall时,例如sys_write为0表示80x,而syscall为1。

http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html表示32位或0x80http://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是键盘处理程序。
  • 这里的共同主题是什么,当调用中断/系统调用时,内核检查寄存器的状态以查看需要哪种类型的系统调用。例如,通过查看eax寄存器并确定要执行的操作,内部上下文切换到内核空间,执行该过程并将上下文切换回用户空间,并可以选择返回到呼叫,即成功还是失败。


20
投票

我的答案here涵盖了您的问题。


7
投票

更改前请注意:系统调用号不同


-3
投票

int 0x80是更好的术语,用于指示其对内核的系统调用

来告诉它执行某项操作。
© www.soinside.com 2019 - 2024. All rights reserved.