当我在用户模式下调用系统调用时,如何在OS中处理调用?
它会调用一些可执行的二进制文件还是某些标准库?
如果是,完成通话需要什么样的东西?
看看这个.
从2.5版开始,linux内核在Pentium II +处理器上引入了一种新的系统调用输入机制.由于使用现有软件中断方法的Pentium IV处理器的性能问题,使用Pentium II +处理器上提供的SYSENTER/SYSEXIT指令实现了替代系统调用输入机制.本文探讨了这种新机制.讨论仅限于x86架构,所有源代码清单都基于linux内核2.6.15.6.
什么是系统调用?
系统调用为userland进程提供了一种从内核请求服务的方法.什么样的服务?由存储,内存,网络,进程管理等操作系统管理的服务.例如,如果用户进程想要读取文件,则必须进行"打开"和"读取"系统调用.通常,进程不会直接调用系统调用.C库提供了所有系统调用的接口.
系统调用会发生什么?
内核代码段根据用户进程的请求运行.此代码在环0(具有当前权限级别-CPL-0)中运行,这是x86体系结构中的最高权限级别.所有用户进程都在第3环(CPL 3)中运行.
因此,要实现系统调用机制,我们需要的是
1)从环3调用ring 0代码的方法.
2)一些内核代码来处理请求.
做它的好老方法
在一段时间之前,linux曾经使用软件中断在所有x86平台上实现系统调用.要执行系统调用,用户进程会将所需的系统调用号复制到%eax,并执行'int 0x80'.这将产生中断0x80并调用中断服务程序.对于中断0x80,此例程是"所有系统调用处理"例程.此例程将在环0中执行.此例程(如文件/usr/src/linux/arch/i386/kernel/entry.S中所定义)将保存当前状态,并根据%中的值调用相应的系统调用处理程序EAX.
这种新的闪亮方式
据发现,这种软件中断方法在Pentium IV处理器上要慢得多.为了解决这个问题,Linus实现了一种替代系统调用机制,以利用所有Pentium II +处理器提供的SYSENTER/SYSEXIT指令.在进一步采用这种新方法之前,让我们更熟悉这些说明.
这取决于系统调用的含义.你的意思是C库调用(通过glibc)还是实际的系统调用?C库调用最终总是使用系统调用.
进行系统调用的旧方法是通过软件中断,即int
指令.int 0x2e
Linux拥有Windows int 0x80
.OS在中断描述符表(IDT)中为0x2e或0x80设置中断处理程序.然后,此处理程序执行系统调用.它将参数从用户模式复制到内核模式(这由特定于操作系统的约定控制).在Linux上,参数被使用过ebx
,ecx
,edx
,esi
,和edi
.在Windows上,参数从堆栈中复制.然后处理程序执行某种查找(以查找函数的地址)并执行系统调用.系统调用完成后,iret
指令返回用户模式.
新的方式是sysenter
和sysexit
.这两条指令基本上可以为您完成所有注册工作.操作系统通过模型特定寄存器(MSR)设置指令.之后,它几乎与使用相同int
.