zoukankan      html  css  js  c++  java
  • 系统调用syscall---用户态切换到内核态的唯一途径

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

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

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

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

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

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

    4、分别举例如下:

        

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

          目前的分配是放在 <asm/unistd.h> 中定义。

    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)的返回结果。

  • 相关阅读:
    day 22 反射,双下方法
    day 21 封装,多态,类的其他属性
    day 20 类与类之间的关系,继承2
    day 19 类的名称空间,组合,派生
    day 18 类,对象
    day 17 re模块
    注意NULL
    SQL_DISTINCT
    重载赋值运算符
    随机序列问题
  • 原文地址:https://www.cnblogs.com/zhouhaibing/p/7787011.html
Copyright © 2011-2022 走看看