扒开系统调用的三层皮

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

一般现代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. array_map 巧替 foreach

    1.array_reduce( $arr , callable $callback ) 使用回调函数迭代地将数组简化为单一的值. 其中$arr 为输入数组,$callback($result , $v ...

  2. 流式套接字:基于TCP协议的Socket网络编程(案例2)

    案例:在案例1的基础上实现一个服务器对应多个客户端(多线程),且获得每个客户端的IP. 线程代码: package com.yh.mySocket; import java.io.BufferedRe ...

  3. shiro实战系列(二)之入门实战续

    下面讲解基于实战系列一,所以相关的java文件获取pom.xml及其log4j文件同样适用于本次讲解. 一.Using Shiro Using Shiro 现在我们的 SecurityManager ...

  4. 网页设计之字体和 CSS 调整

    调整 CSS 首先,我们先来看看问题的源头.CSS 的出现曾是技术的一大进步.你可以用一个集中式的样式表来装饰多个网页.如今很多 Web 开发者都会使用 Bootstrap 这样的框架. 这些框架当然 ...

  5. Linux中Shell

    Linux中Shell Shell是什么 ​ Shell是一个命令行解释器,为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,可以用Shell来启动.挂起.停止.编写一些程序. S ...

  6. PAT B1035 插入与归并 (25 分)

    根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到全部元素有序. 归并排序进行如下迭 ...

  7. Android String.xml中的符号总结

    <b></b>加粗字体 <i></i> 斜体字体 <u></u> 给字体加下划线 \n 换行 \u0020表示空格 \u2026 ...

  8. 面试题之O(n)内旋转字符串

    样例: 字符串“abcd1234"左移3位结果为”234abcd1“ K:左移位数 L:字符串长度 方案1:暴力 O(K * L) 可以每次将数组中的元素左移一位,循环K次. abcd123 ...

  9. a标签按钮样式

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  10. [Baltic 2011]Lamp BZOJ2346

    分析: 建图最短路,比较裸. 我们可以考虑,如果是‘\’那么,左上连右下边权为0,左下连右上边权为1,反之亦然. 卡裸spfa,加点优化能过,我就直接改成的堆优化Dijkstra 附上代码: #inc ...