什么是更好的"int 0x80"或"系统调用"?

Ale*_*lex 57 linux x86 assembly system-calls

我研究Linux内核并发现,对于int 0x80体系结构,中断syscall不能用于调用系统调用.

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

编辑:我使用内核3.4

Paw*_*pak 75

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

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

另外,请看这个这个.

  • 选择一个而不是另一个的建议是针对OS内核开发人员.然后他们的选择成为ABI的一部分,如果你正在开发某个操作系统,你必须尊重ABI.例如,Linux/i386使用int 0x80并在寄存器中传递参数,而MirBSD/i386使用int 0x80并在堆栈上传递参数,其间有一个帧指针(这意味着在使用cdecl时用户空间没有设置成本).[这个答案主要针对那些被派到这里但不是OS内核设计师的人.] (5认同)
  • 问题与Linux有关,答案描述了在Linux(i386和x86_64)上调用syscall的可能方法。您建议Linux / i386仅使用“ int 0x80”,这是不正确的。进行系统调用的首选方法是使用VDSO。 (2认同)

Bas*_*tch 20

我的回答这里涉及您的问题.

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

请注意,AFAIK,简单系统调用成本的重要部分是从用户空间到内核并返回.因此,对于一些系统调用(可能是gettimeofday,getpid...)的VDSO可能避免甚至是(和技术上可能会避免做一个真正的系统调用).对于大多数的系统调用(如open,read,send,mmap....)系统调用的内核成本足够大,以使用户空间的任何改善内核空间的转换(例如,使用SYSENTERSYSCALL机器指令代替INT)微不足道.

  • 回到80386天,进入内核的最快方法实际上是[执行无效指令](http://blogs.msdn.com/b/oldnewthing/archive/2004/12/15/313250.aspx). (18认同)

Tho*_*mas 7

在更改之前要注意这一点:执行0x80或系统调用时系统调用号不同,例如sys_write为4,0x80,1为syscall.

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 for syscall