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

转载于:https://www.cnblogs.com/zhouhaibing/p/7787011.html

系统调用syscall---用户态切换到内核态的唯一途径相关推荐

  1. 理解用户态切换到内核态——内核态下有一个特殊的进程

    现在想想,从用户态进入到内核态,相当于一次进程切换--这就好像内核态下有一个特殊的进程. 我就把进入内核态后,理解为进入了一个特殊的进程,一切都忽然合理了,恍然大悟--所以所有用户态的task(称之为 ...

  2. Linux 一个进程如何从用户态切换到内核态运行

    首先我们先理解用户态和内核态的概念 用户态:当一个进程调用库函数时就会进入用户态或者自己写的代码都是运行在用户态,使用的地址都是用的用户态中的地址 内核态:当要完成系统核心功能时要运行的状态 一个进程 ...

  3. linux 切换用户_Linux 用户态切换到内核态的 3 种方式

    系统调用 这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如 fork() 实际上就是执行了一个创建新进程的系统调用.而系统调用的机制其核 ...

  4. 用户态和内核态:用户态线程和内核态线程有什么区别?

    转载 文章来源于 拉钩教育 重学操作系统 林䭽 用户态和内核态:用户态线程和内核态线程有什么区别? 什么是用户态和内核态 Kernel 运行在超级权限模式(Supervisor Mode)下,所以拥有 ...

  5. 计算机基础理论知识梳理篇(二):目态(用户态)、管态(内核态)

    目态与管态 多数计算机系统将CPU执行状态分为目态(用户态)与管态(内核态),CPU的状态属于程序状态字PSW的一位,CPU交替执行操作系统程序和用户程序. 1. CPU设计中的目态.管态 目态指非特 ...

  6. 操作系统中用户态和内核态(系统态)是什么?用户态如何变成内核态?

    用户态:当进程在执行用户自己的代码时,则称其处于用户态,这时cpu 访问资源有限,运行在用户态下的程序不能直接访问操作系统内核数据结构和程序. 内核态:当一个任务(进程)执行系统调用而陷入内核代码中执 ...

  7. linux-进程切换,用户态进程,内核态进程

    https://blog.csdn.net/Hatsune_Miku_/article/details/77851218

  8. Linux预备知识(三):系统调用-用户态/内核态

    1)示例 void testfork() { if(0 = = fork()){ printf("create new process success!\n"); }printf( ...

  9. 进程用户态和内核态及其切换过程

    1.进程的堆栈 内核在创建进程的时候,会为进程创建相应的堆栈.每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间.当进程在用户空间运行时,CPU堆栈指针寄存器里面的内容是用户堆 ...

最新文章

  1. 基于Winsock API的VC网络编程实战
  2. 2017 04 04 省选模拟
  3. saltstack配置管理之YAML(二)
  4. curl java_如何将curl -X post转换为java
  5. boost::smart_ptr模块collector相关的测试程序
  6. 让评审人爱上你的8个要点
  7. Postman入门到精通01
  8. 【jQuery笔记Part4】01-jQuery-节点操作-添加节点-删除节点-复制节点
  9. js 去除html标签
  10. 怎么制作铁闸门_咖啡师养成记 | 教你做一杯合格的拿铁咖啡
  11. normalize.css下载
  12. 安全控件开发原理分析 支付宝安全控件开发 网银密码控件 C++
  13. echarts 生成 迁徙图_Echarts地图的迁徙图
  14. gstreamer v4l2预览双摄像头
  15. 如何解决360的导航一直绑定为首页(亲测有效)
  16. html dom onblur,html DOM Event对象onblur事件
  17. Android 长按3Dtouch快捷方式
  18. Fashion-mnist数据的读取与保存
  19. 辞旧迎新,继往开来:2021→2022
  20. excel每页都显示标题的方法

热门文章

  1. 【跃迁之路】【440天】刻意练习系列199(2018.04.21)
  2. Java条形码生成(128c)
  3. canvas做的图片查看器1
  4. 智慧城市建设面临“三座大山” 安全与服务需两手抓
  5. 【Android】SlidingTabs
  6. Grunt 入门指南5:项目脚手架
  7. HDU 4281 Judges' response [MTSP]
  8. 安全研究剖析:******方式演示
  9. android:windowSoftInputMode属性详解
  10. OpenCV实现Mat与vector,Mat与数组互转