系统调用syscall---用户态切换到内核态的唯一途径-创新互联

1、应用程序有时需要内核协助完成一些处理,但是应用程序不可能执行内核代码(主要是安全性考虑),

成都创新互联一直在为企业提供服务,多年的磨炼,使我们在创意设计,网络营销推广到技术研发拥有了开发经验。我们擅长倾听企业需求,挖掘用户对产品需求服务价值,为企业制作有用的创意设计体验。核心团队拥有超过10多年以上行业经验,涵盖创意,策化,开发等专业领域,公司涉及领域有基础互联网服务服务器托管雅安成都app软件开发公司、手机移动建站、网页设计、网络整合营销。

   那么,应用程序需要有一种机制告诉内核,它现在需要内核的帮助,这个机制就是系统调用。

2、系统调用的本质是,应用程序主动触发软中断,这个软中断异常立即被系统捕获到(cpu指令产生异常,触发异常处理程序),在异常处理程序中发现产生的异常是128号异常,于是执行这个异常的处理程序,这个程序就是系统调用的处理程序,通过指定不同的软中断号,异常处理程序跳转到对应的系统调用的内核态实现程序中执行,于是内核态代替用户态完成处理。

3、应用程序触发系统调用的方式,有两种方法,

   方法一、通过系统提供的库函数(如Libc库)

   方法二、直接调用系统提供的系统调用函数进行。

4、分别举例如下:

   

5、系统调用的关键是:系统调用号的分配。

   目前的分配是放在 中定义。

6、快速系统调用的概念,在产生一个中断后,处理器中控制器会进行一系列权限检查,只有得到核实后,控制单元才设置中断处理所需要的执行环境,基于软中断的128号系统调用也需要作一系列的检查,才能进入内核态进行系统调用的处理工作。

    由于系统调用的特点,这一系列的权限检查变得多余,为此intel 在奔腾2处理器中,在传统的int 128号中断处理的基础上,又提供了快速系统调用的汇编指令sysenter/sysexit,核心思想是,产生中断时,避免权限检查,直接将处理器置为预定义的级别,同时将系统调用所需的执行环境信息保存在一组型号相关寄存器中,避免了访问内存,进一步提高进行内核态的速度。

7、自己实现一个系统调用的步骤:分配系统调用号,明确参数、在内核态校验参数(进程id, 用户态地址等)、执行权限检查(例如:capable(CAP_SYS_NICE))、重编内核绑定系统调用。

   对两个事务的说明。

   参数校验:进程不能传递一个非法地址,让内核带它去读取或者写入,所以,内核必须通过copy_to_user()或者copy_from_user()来进行校验。

   权限检查:进程的权限也就是运行该进程的用户权限,例如,用户不能修改其他进程的nice值,而只有root用户才可以。此时需要使用capable(CAP_SYS_NICE)进行检查。

           再比如说,普通用户不能重启系统,那么就需要校验 capable(CAP_SYS_BOOT)的返回结果。


本文名称:系统调用syscall---用户态切换到内核态的唯一途径-创新互联
链接URL:http://pwwzsj.com/article/dpgech.html