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

系统调用syscall---用户态切换到内核态的唯一途径的更多相关文章

  1. C# 读写文件从用户态切到内核态,到底是个什么流程?

    一:背景 1. 一个很好奇的问题 我们在学习 C# 的过程中,总会听到一个词叫做 内核态 ,比如说用 C# 读写文件,会涉及到代码从 用户态 到 内核态 的切换,用 HttpClient 获取远端的数 ...

  2. Linux操作系统学习_用户态与内核态之切换过程

    因为操作系统的很多操作会消耗系统的物理资源,例如创建一个新进程时,要做很多底层的细致工作,如分配物理内存,从父进程拷贝相关信息,拷贝设置页目录.页表等,这些操作显然不能随便让任何程序都可以做,于是就产 ...

  3. go语言学习--内核态和用户态(协程)

    go中的一个特点就是引入了相比于线程更加轻量级的协程(用户态的线程),那么什么是用户态和内核态呢? 一.什么是用户态和内核态 当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核 ...

  4. Linux用户态和内核态

    究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例 ...

  5. linux 用户态 内核态

    http://blog.chinaunix.net/uid-1829236-id-3182279.html 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在 ...

  6. Linux探秘之用户态与内核态

    一. Unix/Linux的体系架构 如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核).内核从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程 ...

  7. Linux 用户态和内核态

    1.特权级特权级用来管理和控制程序执行.如Intel x86架构的CPU,有0~3四个特权级,0级最高,3级最低.硬件在执行每条指令时都会检查指令具有的特权级.硬件提供了特权级使用机制,对操作系统来说 ...

  8. 【转载】 Linux用户态和内核态

    [说明]转载自 http://my.oschina.net/liubin/blog/27795 究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分 ...

  9. 用户态与内核态 & 文件流与文件描述符 简介【转】

    转自:https://www.cnblogs.com/Jimmy1988/p/7479856.html 用户态和内核态 程序代码的依赖和调用关系如下图所示: Lib:标准ASCI C函数,几乎所有的平 ...

随机推荐

  1. virtualbox ubuntu 安装 openssh-server

    最近为了学 DevOps,自己动手在 virtualbox 上安装 ubuntu 系统,安装完后发现好坑,没办法用 XShell 连接.在线安装 openssh-server 又发现没有配置软件源,手 ...

  2. 今日头条面试题——LRU原理和Redis实现

    很久前参加过今日头条的面试,遇到一个题,目前半部分是如何实现 LRU,后半部分是 Redis 中如何实现 LRU. 我的第一反应应该是内存不够的场景下,淘汰旧内容的策略.LRU ... Least R ...

  3. [译]ASP.NET Core中使用MediatR实现命令和中介者模式

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9866068.html 在本文中,我将解释命令模式,以及如何利用基于命令模式的第三方库来实现它们,以及如何 ...

  4. mysql 开发进阶篇系列 46 物理备份与恢复( xtrabackup的 选项说明,增加备份用户,完全备份案例)

    一. xtrabackup 选项说明 在操作xtrabackup备份与恢复之前,先看下该工具的选项,下面记录了xtrabackup二进制文件的部分命令行选项,后期把常用的选项在补上.点击查看xtrab ...

  5. jQueryh插件imgareaselect

    1.插件介绍 imgareaselect 是一个 允许用户使用简单.直观的点击.拖动界面图像选择矩形区域的jQuery插件.该插件可用于 web 应用程序中轻松实现图像裁剪功能,以及其他功能,如照片标 ...

  6. Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again 解决方法

    vim /etc/yum.repos.d/epel.repo 1 [epel] 2 name=Extra Packages for Enterprise Linux 7 - $basearch 3 # ...

  7. solr调用lucene底层实现倒排索引源码解析

    1.什么是Lucene? 作为一个开放源代码项目,Lucene从问世之后,引发了开放源代码社群的巨大反响,程序员们不仅使用它构建具体的全文检索应用,而且将之集成到各种系统软件中去,以及构建Web应用, ...

  8. thinkphp自动创建数据对象分析

    thinkphp有一个自动创建数据对象的create方法,核心代码如下 public function create($data='',$type='') { // 如果没有传值默认取POST数据 i ...

  9. Tomcat8源码笔记(五)组件Container分析

    Tomcat8源码笔记(四)Server和Service初始化 介绍过Tomcat中Service的初始化 最先初始化就是Container,而Container初始化过程是咋样的? 说到Contai ...

  10. 【详解JavaScript系列】JavaScript之变量

    一  概述 本篇文章将讲解JavaScript中的变量,大致内容归结为: 1.变量定义 包括变量声明和变量初始化 2.变量种类 包括局部变量和全局变量 3.变量链式作用域及访问 二  内容 (一)变量 ...