zoukankan      html  css  js  c++  java
  • Linux内核分析作业四

    扒开系统调用的三层皮

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

    一般现代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代码中嵌入汇编代码触发系统调用获取系统当前时间

    总结

    操作系统为用户态进程与硬件设备进行交互提供了一组接口——系统调用。
    其作用是:把用户从底层的硬件编程中解放出来;极大的提高了系统的安全性;使用户程序具有可移植性。

  • 相关阅读:
    Vue.js——60分钟组件快速入门
    搭建VUE项目的准备(利用vuecli来构建项目)
    总结一下java如何进行逆向工程
    C#模糊查询Access(转)
    Asp.net网站发布至IIS( vs2010 )
    常用HTML标记
    解决使用MasterPage后,Page.FindControl方法找不到指定控件的问题
    自定义 DataList 显示数据行数的方法
    【菜鸟做水题】:杭电 find your present(用异或的解题思想)
    【菜鸟做水题】:杭电 hide handkerchief (辗转相除判断2数互质)
  • 原文地址:https://www.cnblogs.com/javajy/p/5286524.html
Copyright © 2011-2022 走看看