Ale*_*lex 57 linux x86 assembly system-calls
我研究Linux内核并发现,对于int 0x80体系结构,中断syscall不能用于调用系统调用.
问题是:在int 0x80架构的情况下什么是更可取的int 0x80或syscall为什么?
编辑:我使用内核3.4
Paw*_*pak 75
syscall是进入内核模式的默认方式x86-64.在Intel处理器上,此指令不适用于32位操作模式.sysenter是最常用于在32位操作模式下调用系统调用的指令.它类似于syscall使用起来有点困难,但这是内核的关注点.int 0x80 是一种调用系统调用的传统方法,应该避免使用.调用系统调用的优选方法是使用VDSO,它是在每个进程地址空间中映射的内存的一部分,允许更有效地使用系统调用(例如,在某些情况下根本不进入内核模式).与传统int 0x80方式,处理syscall或sysenter指令相比,VDSO也更加困难.
Bas*_*tch 20
我的回答这里涉及您的问题.
实际上,最近的内核正在实现VDSO,特别是动态优化系统调用(内核将VDSO设置为最适合当前处理器的某些代码).因此,您应该使用VDSO,并且对于现有的系统调用,您最好使用libc提供的接口.
请注意,AFAIK,简单系统调用成本的重要部分是从用户空间到内核并返回.因此,对于一些系统调用(可能是gettimeofday,getpid...)的VDSO可能避免甚至是(和技术上可能会避免做一个真正的系统调用).对于大多数的系统调用(如open,read,send,mmap....)系统调用的内核成本足够大,以使用户空间的任何改善内核空间的转换(例如,使用SYSENTER或SYSCALL机器指令代替INT)微不足道.
在更改之前要注意这一点:执行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
| 归档时间: |
|
| 查看次数: |
28812 次 |
| 最近记录: |