扒开系统调用的三层皮

一、用户态、内核态和中断

一般现代CPU都有几种不同的指令级别

在高级别执行级别下,代码可以执行特权指令,访问任意的物理地址,称之为内核态

在相应的低指令执行级别下,代码的掌控范围会受到限制,只能在对应级别允许的范围内活动,称之为用户态

为什么会有权限级别划分

为了让系统本身更稳定,保证代码不被误写崩溃

CS寄存器的最低两位表明了当前代码的特权级

CPU每条指令的读取都是通过CS:eip这两个寄存器

CS:代码段选择寄存器
eip:偏移量寄存器

在Linux中,地址空间是一个显著的标志,0xc0000000以上的地址空间只能在内核态下访问

地址空间指逻辑地址而不是物理地址

中断处理时从用户态进入内核态的主要方式

系统调用是一种特殊的中断

寄存器上下文——从用户态切换到内核态

必须保存用户态寄存器的上下文:要保存哪些?保存到哪里?

中断/int指令会字啊堆栈上保存一些寄存器的值中断发生后的第一件事就是保存现场

二、系统调用概述和系统调用的三层皮

系统调用的概述

系统调用的意义:操作系统为用户态进程与硬件设备进行交互提供了一组接口————系统调用

把用户从底层的硬件编程中解放出来
极大的提高了系统的安全性
使用户程序具有可移植性

操作系统提供的API和系统调用的关系

API只是一个函数调用
系统调用通过软终端向内核法术一个明确的请求

不是每个API都对应一个特定的系统调用

API可能直接通过用户态的服务
一个单独的API可能调用几个系统调用
不同的API可能调用了同一个系统调用

返回值

大部分封装例程返回一个函数,其值的含义依赖于相应的系统调用
-1在多数情况下表示内核不能满足进程的请求
Licb中定义的errno变量包含特定的出错码

系统调用号将xyz和system_xyz关联起来了

当用户态进程调用一个系统调用时,CPU切换到内核并开始执行一个内核函数

传参

内核实现了很多不同的系统调用,进程必须致命那些需要系统调用,着需要传递一个名为系统调用号的参数

系统调用的参数传递方式:

三、使用库函数API获取系统当前时间

使用C代码中嵌入汇编代码触发系统调用获取系统当前时间

总结

操作系统为用户态进程与硬件设备进行交互提供了一组接口——系统调用。

其作用是:把用户从底层的硬件编程中解放出来;极大的提高了系统的安全性;使用户程序具有可移植性。

Linux内核分析作业四的更多相关文章

  1. Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介

    原文:Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介 Linux内核分析(四) 两天没有更新了,上次博文我们分析了linux的内存管理子系统,本来我不想对接下来的进程管理 ...

  2. Linux内核分析第四章 读书笔记

    Linux内核分析第四章 读书笔记 第一部分--进程调度 进程调度:操作系统规定下的进程选取模式 面临问题:多任务选择问题 多任务操作系统就是能同时并发地交互执行多个进程的操作系统,在单处理器机器上这 ...

  3. Linux内核实验作业四

    实验作业:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 20135313吴子怡.北京电子科技学院 [第一部分]使用库函数API来获取用户标识号.库函数为getuid() 代码如下: ...

  4. linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...

  5. Linux内核分析作业第四周

    系统调用的三个层次 一.用户态.内核态和中断 用户通过库函数与系统调用联系起来. 1.内核态 在高的执行级别下,代码可以执行特权指令,访问任意的物理地址,这时的CPU就对应内核态 2.用户态: 在低级 ...

  6. Linux内核分析作业 NO.5

    拔掉系统调用的三层皮(下) 于佳心 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 ...

  7. Linux内核分析作业 NO.4

    扒开系统调用的三层皮(上) 于佳心 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 ...

  8. 【MOOC EXP】Linux内核分析实验四报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [使用库函数API和C代码中嵌入汇编代 ...

  9. Linux内核分析作业第二周

    操作系统是如何工作的 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.函数调用堆栈 1.计算机工作三 ...

随机推荐

  1. .Net Core Api 跨域配置

    .Net Core 和Asp.Net 不同,不需要再去引用其他的跨域组件.创建项目时,就有了. 让接口实现跨域,需要配置两个地方. 一.Startup.cs 这里需要配置两个地方 public voi ...

  2. python第三十五课——生成器

    1.生成器: 什么是生成器? 它内部封装了一套公式/算法,只有等到需要调用/执行数据时 --> next()函数执行 才会将公式计算得到数据结果,这就是生成器的原理(核心思想): [注意事项]: ...

  3. Spring IOC 之 SmartInitializingSingleton

    使用 实现该接口后,当所有单例 bean 都初始化完成以后, 容器会回调该接口的方法 afterSingletonsInstantiated. 主要应用场合就是在所有单例 bean 创建完成之后,可以 ...

  4. [AHOI2014/JSOI2014]支线剧情

    题目 有源汇上下界最小费用可行流 首先注意到要求是每一条边都经过至少一次,所以对于每一条边我们设成\([1,\infty]\)就好了 另外所有点都能结束剧情,所有点都要向汇点\(t\)连一条\([0, ...

  5. FastJson遇见的问题或项目实战中优化的问题,看源码都可以解决

    1:感觉见鬼了一般存储JSONObject中的字段竟然不见了? JSONObject object=new JSONObject(); Map fields = new HashMap(); fiel ...

  6. MySQL数据类型字节长度

    1.字符串 char(n): n 字节长度 varchar(n): 如果是 utf8 编码, 则是 3 n + 2字节; 如果是 utf8mb4 编码, 则是 4 n + 2 字节. 2.数值类型: ...

  7. JS日历控件优化(增加时分秒)

    JS日历控件优化      在今年7月份时候 写了一篇关于 "JS日历控件" 的文章 , 当时只支持 年月日 的日历控件,现在优化如下:      1. 在原基础上 支持 yyyy ...

  8. Android 将拼接好并加上边框的图片保存到内存卡中

    通过前两篇文章,问们学会了怎样拼接图片.给拼接好的图片加上边框样式,但这还不够,忙活了大半天 终于拼接好并给图片美化了,但是程序一旦推出,之前做的工作都白费了.这时我们会想,能不能把拼接好的图片保存起 ...

  9. Jmeter—开篇

    Jmeter以开源.轻便著称,做接口测试.性能测试都可以借助Jmeter,从这篇开始记录我使用到的Jmeter功能. 安装 Jmeter官网:http://jmeter.apache.org/ 去官网 ...

  10. 添加静态路由 route add -host 子网掩码 -- 在线解析

    1.215        -----       R(172.16.0.1)      <--------- gw(61.146.164.109) |                       ...