20135130王川东

一、用户态、内核态和中断处理过程

CPU的几种不同的执行级别:

高执行级别下,代码可以执行特权指令,访问任意的物理地址,这种执行级别对应内核态;

低级别执行状态下,代码的掌握范围会受到限制,只能在对应级别允许的范围内活动。

例:intel x86 CPU有四种不同的执行级别0-3,Linux只使用其中的0级和3级分别来表示内核态和用户态。

区分用户态和内核态:

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

CPU每条指令的读取都是通过cs:eip两个寄存器:cs:代码选择寄存器,eip:偏移量寄存器。

0xc0000000以上的地址空间只能在内核态下访问,

0x0000000-0xbfffffff的地址空间在二者状态下都可以访问(注:这里的地址空间是逻辑地址不是物理地址)

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

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

寄存器上下文

—从用户态切换到内核态时,

必须保存用户态的寄存器上下文,同时内核态的相应寄存器的相应的值

中断/int指令会在堆栈上保存一些寄存器的值。如:用户态栈顶地址、当前的状态字、当时的cs:eip的值。

中断发生和结束:

中断发生后第一件是保存现场(进行中断程序 保存 需要用到的寄存器的数据)

 中断处理结束前最后一件事是恢复现场(退出中断程序恢复保存寄存器的数据)

二、系统调用概述

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

API -:应用编程接口

与系统调用区别:

  API只是一个函数定义

 系统调用是通过软中断向内核发出一个明确的请求。

不是每一个API都对应一个系统调用:

  API可能直接提供用户态服务。如一个数学函数
  一个单独的API可能调用几个系统调用
  不同的API可能调用了同一个系统调用

返回值: 大部分封装例程返回一个整数,含义依赖于相应的系统调用

 -1在大多数情况下表示内核不能满足进程的请求
Libc中errno变量包含特定出错码
传参:
内核实现很多不同的系统调用,需要传递一个名为系统调用号的参数,
使用eax寄存器传递
实验:
选用24号系统调用:getuid。
代码如下:
1、使用库函数API:

2,嵌入汇编代码:

《Linux内核与分析》第四周的更多相关文章

  1. Linux内核及分析 第四周 扒开系统调用的三层皮(上)

    实验过程 选择20号系统调用getpid(取得进程识别码) 在网上查询getpid函数的C语言代码以及其嵌入式汇编语句 C语言代码: #include <stdio.h> #include ...

  2. Linux内核源代码分析方法

    Linux内核源代码分析方法   一.内核源代码之我见 Linux内核代码的庞大令不少人"望而生畏",也正由于如此,使得人们对Linux的了解仅处于泛泛的层次.假设想透析Linux ...

  3. 2019-2020-1 20199303 《Linux内核原理分析》 第一周作业

    2019-2020-1 20199303 <Linux内核原理分析> 第一周作业 1. 环境准备 在众多的Linux发行版中,Ubuntu,小红帽还有类Unix系统的BSD系统,我选择了目 ...

  4. Linux内核启动分析过程-《Linux内核分析》week3作业

    环境搭建 环境的搭建参考课件,主要就是编译内核源码和生成镜像 start_kernel 从start_kernel开始,才真正进入了Linux内核的启动过程.我们可以把start_kernel看做平时 ...

  5. 从linux内核代码分析操作系统启动过程

    朱宇轲 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 在本次的实验中, ...

  6. Linux内核启动分析

    张超<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 我的代码可见https://www.shiyanlo ...

  7. Linux内核及分析 第八周 进程的切换和系统的一般执行过程

    学习笔记: 一.进程调度与进程调度的时机分析 1.不同类型的进程有不同需求的调度需求: 第一种分类: —I/O-bound:频繁的进行I/O,通常会花费很多时间等待I/O操作的完成 —CPU-boun ...

  8. Linux内核及分析 第七周 可执行程序的装载

    实验步骤 1. 更新menu,用test.c覆盖test_exec.c 2. 把init 和 hello 放到了rootfs.img目录下,执行exec命令的时候自动加载了hello程序 3. 执行e ...

  9. Linux内核及分析 第六周 分析Linux内核创建一个新进程的过程

    实验过程 1.github上克隆相应的mengning/menu.git 2.测试menuOS,测试fork直接执行结果 3.配置调试系统,进入gdb调试,利用file linux-3.18.6/vm ...

  10. Linux内核及分析 第五周 扒开系统调用的三层皮(下)

    实验内容: 1.执行rm menu -rf命令,强制删除原有的menu 2.使用git命令 git clone https://github.com/mengning/menu.git 克隆新的men ...

随机推荐

  1. phpstrom快捷键

    PhpStorm 常用快捷键和配置 配置 设置代码及字体风格:File->Settings->Editor->Colors&Fonts->Font 安装插件(如:tp, ...

  2. js 里常用的字符串操作方法

    /*var str='啦啦啦'; var str1='哈哈哈' //charAt() 返回指定索引处的字符串 console.log(str.charAt(3)) //charCodeAt() 返回指 ...

  3. .net下redis和rabbitmq简单使用demo

    是参考 一下两篇博文整理了下. Redis:   https://www.cnblogs.com/5ishare/p/6492380.html RabbitMq:   https://www.cnbl ...

  4. redis常用数据类型操作命令集锦

    redis操作命令集锦 redis中五种数据类型 1) 字符串 String 特点: 存储所有的字符和字符串 应用场景: 做缓存使用 2) 哈希 hash 特点: 相当于java中hashMap集合 ...

  5. 二叉树 ADT接口 遍历算法 常规运算

    BTree.h   (结构定义, 基本操作, 遍历) #define MS 10 typedef struct BTreeNode{ char data; struct BTreeNode * lef ...

  6. .Net 两个对像之间的映射 (一 )

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. 20155232 《Java程序设计》实验三实验报告

    20155232 <Java程序设计>实验三实验报告 实验内容 Java敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验步骤 (一)敏捷开发与XP 敏捷开发(Agile ...

  8. 20155315 2016-2017-2 《Java程序设计》第四周学习总结

    教材学习内容总结 1.继承与多态 Java中只有单一继承,也就是只能有一个父类; 多态即指一个父类可由多个子类继承. 继承可以复用代码,更大的用处是实现「多态」. 封装是继承的基础,继承是多态的基础 ...

  9. class kind type sort区别

    class多用于 级别比如高级货就是 first class,primary class等等,以此类推kind 和sort 基本一样,就像你说的,译为 种类,what kind of疑问,回答时用so ...

  10. Hadoop守护进程的作用(转)

    概述: <ignore_js_op> Hadoop是一个能够对大量数据进行分布式处理的软件框架,实现了Google的MapReduce编程模型和框架,能够把应用程序分割成许多的 小的工作单 ...