当前位置:  开发笔记 > 运维 > 正文

如何在Linux中实现系统调用?

如何解决《如何在Linux中实现系统调用?》经验,为你挑选了2个好方法。

当我在用户模式下调用系统调用时,如何在OS中处理调用?

它会调用一些可执行的二进制文件还是某些标准库?

如果是,完成通话需要什么样的东西?



1> GregD..:

看看这个.

从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指令.在进一步采用这种新方法之前,让我们更熟悉这些说明.



2> wj32..:

这取决于系统调用的含义.你的意思是C库调用(通过glibc)还是实际的系统调用?C库调用最终总是使用系统调用.

进行系统调用的旧方法是通过软件中断,即int指令.int 0x2eLinux拥有Windows int 0x80.OS在中断描述符表(IDT)中为0x2e或0x80设置中断处理程序.然后,此处理程序执行系统调用.它将参数从用户模式复制到内核模式(这由特定于操作系统的约定控制).在Linux上,参数被使用过ebx,ecx,edx,esi,和edi.在Windows上,参数从堆栈中复制.然后处理程序执行某种查找(以查找函数的地址)并执行系统调用.系统调用完成后,iret指令返回用户模式.

新的方式是sysentersysexit.这两条指令基本上可以为您完成所有注册工作.操作系统通过模型特定寄存器(MSR)设置指令.之后,它几乎与使用相同int.

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有