《Linux内核分析》第四周学习总结

                        ——扒开系统调用的三层皮

姓名:王玮怡  学号:20135116

理论总结部分:

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

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

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

1、用户态

在相应的低级执行状态下,代码的掌控范围会受到限制,此时为用户态。

2、内核态

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

3、举例

Intel x86 CPU有四种不同的执行级别0-3,Linux只使用了0级和3级分别表示内核态和用户态。

4、Linux代码中如何区分用户态和内核态

(1)cs寄存器的最低两位表明当前代码的特权级

(2)CPU每条指令的读取都是通过cs:eip这两个寄存器,其中cs是代码段选择寄存器,eip是偏移量寄存器

(3)上述判断有硬件完成

(4)一般来说在Linux中,地址空间是一个显著的标志:

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

0x00000000-oxbfffffff的地址空间在两种状态下都能访问

(注意:这里说的地址空间为逻辑地址而不是物理地址)

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

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

(1)从内核态切换到用户态时必须保存用户态的寄存器上下文,同时也要将内核态的寄存器相应值放入当前CPU中

(2)中断/int指令会在堆栈上保存一些寄存器的值,如用户态栈顶地址、当前的状态字、当时的cs:eip的值,同时还保存内核态栈顶地址、当前的状态字以及中断处理程序的入口(cs:eip的值)

(3)中断信号/int指令发生后进入中断处理程序,执行的第一个动作是SAVE_ALL,将其他寄存器的值push到内存堆栈中去,保存现场;中断处理程序结束前最后一件事是恢复现场RESTORE_ALL,将用户态的寄存器再popl出来到当前CPU中;iret指令与中断信号(包括int指令)发生时的CPU的动作正好相反

(4)中断处理的完整过程

第二节 系统调用概述

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

1、系统调用的意义

2、操作系统提供的API(应用编程接口)和系统调用的关系

(1)API只是一个函数定义;系统调用通过软中断(rap)向内核发出一个明确的请求

(2)Libc库定义的一些API引用了封装例程(wrapper routine,唯一目的就是发布系统调用)

一般每个系统调用对应一个封装例程

库再调用这些封装例程定义出给用户的API

注意:

3、系统调用的三层皮:xyz、system_call和sys_xyz

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

在Linux中通过int$0x80来执行系统调用——产生向量为128的编程异常

(2)传参:内核实现了很多不同的系统调用,进程需要通过传递一个名为系统调用编号的参数来指明需要哪个系统调用(通过eax寄存器来实现传递)——系统调用号将xyz和sys_xyz关联起来

(3)系统调用的参数传递方法

a.系统调用也需要输入输出参数,如实际值、用户态进程地址空间的变量的地址、包含指向用户态函数的指针的数据结构的地址

b.system_call是Linux中所有系统调用的入口点,每个系统调用至少有一个参数,即由eax传递的系统调用号

c.寄存器传递参数的限制:

每个参数的长度不能超过寄存器的长度,即32位

在系统调用号(eax)之外,参数的个数不能超过6个(ebx、ecx、edx、esi、edi、ebp),如果超过6个,就把其中某一个寄存器作为一个指针,指向一块内存,进入内核态可以访问所有的地址空间,通过内存传递数据

实验部分 :使用库函数API和C代码嵌入汇编代码触发同一个系统调用

一、使用库函数API获取当前进程的进程号(getpid())

运行结果如下:

使用getpid(),定义int型的数值变量tt(返回值)

二、使用C代码嵌入汇编代码触发系统调用获取当前进程的进程号(getpid())

mov $0,%%ebx\n\t  系统调用传递第一个参数使用容ebx,这里是NULL(将ebx寄存器清零)

mov $0x14,%%eax\n\t 使用eax传递系统调用号,这里getpid是20

mov %%eax,%0\n\t 系统调用的返回值使用eax存储,tt变量

运行结果如下:

《Linux内核分析》第四周学习总结的更多相关文章

  1. 20145213《Java程序设计》第四周学习总结

    20145213<Java程序设计>第四周学习总结 教材学习内容总结 本周任务是学习面向对象的继承.接口以及之后的如何活用多态.(还真是路漫漫其修远兮啊!)教材也是延续上周艰深晦涩的语言风 ...

  2. 《Java程序设计》第四周学习总结

    20145224-陈颢文 <Java程序设计>第四周学习总结 教材学习内容总结 第六章 继承与多态 ·继承就是面向对象中,子类继承父类,避免重复的行为定义.重复再程序设计上是非常不好的信号 ...

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

    20155304 2016-2017-2 <Java程序设计>第四周学习总结 教材学习内容总结 第六章 继承: 概念: 面向对象中,为避免多个类间重复定义共同行为.(简单说就是将相同的程序 ...

  4. 201521123038 《Java程序设计》 第四周学习总结

    201521123038 <Java程序设计> 第四周学习总结 1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 1.通过 ins ...

  5. 201521123061 《Java程序设计》第四周学习总结

    201521123061 <Java程序设计>第四周学习总结 1. 本章学习总结 (1)思维导图: --- (2)上课内容总结: 第四周学习了Java中的继承与多态,思维导图中已经给出了本 ...

  6. 20175204 张湲祯 2018-2019-2《Java程序设计》第四周学习总结

    20175204 张湲祯 2018-2019-2<Java程序设计>第四周学习总结 教材学习内容总结 -第五章子类与继承要点: -子类与父类: 1.通过使用关键字extends来定义一个类 ...

  7. 20175314 《Java程序设计》第四周学习总结

    20175314 <Java程序设计>第四周学习总结 教材学习内容总结 每个子类只能有一个父类,而一个父类可以有多个子类.可以使用关键字extends来定义一个类的子类:class 子类名 ...

  8. 20155312 张竞予 2006-2007-2 《Java程序设计》第四周学习总结

    20155312 2006-2007-2 <Java程序设计>第四周学习总结 课堂笔记 Ctrl+shift+T调出三个窗口,分别是"vi编写代码","jav ...

  9. 20165318 2017-2018-2 《Java程序设计》第四周学习总结

    20165318 2017-2018-2 <Java程序设计>第四周学习总结 IDEA安装 按照娄老师Intellj IDEA 简易教程,我下载了IDEA但是由于没有注册学校邮箱,我没办法 ...

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

    20172325 2016-2017-2 <Java程序设计>第四周学习总结 教材学习内容总结 1.对类.对象.声明变量的定义和属性有了进一步的了解 2.学会如何编写一个类并运用到需要的程 ...

随机推荐

  1. 探索哪个进程使磁盘I/O升高

    如果生产环境中磁盘使用率突然升高,却不知道因为哪个应用程序导致的,这个时候我们可以使用pidstat命令来查看,比如 Linux .el7.x86_64 (ip.ec2.internal) _x86_ ...

  2. python使用关键字爬取url

    python网路爬虫 --------- 使用百度输入的关键字搜索内容然后爬取搜索内容的url 开发环境:windows7+python3.6.3 开发语言:Python 开发工具:pycharm 第 ...

  3. Static简介

    1.static称为静态修饰符,它可以修饰类中得成员.被static修饰的成员被称为静态成员,也成为类成员,而不用static修饰的成员称为实例成员. 2.当 Voluem volu1 = new V ...

  4. [ADS]An installation support file could not be installed

    ADS:ARM Developer Suits 错误:An installation support file could not be installed 描述: 之前安装了一个不能用的ADS的版本 ...

  5. js中Math之random,round,ceil,floor的用法总结

    1.Math.random(); 结果为0-1间的一个随机数(包括0,不包括1) 2.Math.floor(num); 参数num为一个数值,函数结果为num的整数部分(返回小于等于n的最大整数). ...

  6. MySQL比like语句更高效写法locate position instr find_in_set

    你是否一直在寻找比MySQL的LIKE语句更高效的方法的,下面我就为你介绍几种. LIKE语句 SELECT `column` FROM `table` where `condition` like  ...

  7. ORA-600 [Kcbz_check_objd_typ_1] Running a Job (Doc ID 785899.1)

    ORA-600 [Kcbz_check_objd_typ_1] Running a Job (Doc ID 785899.1) To Bottom In this Document   Symptom ...

  8. VsCode插件开发之插件初步通信

    参考了Egret Wing,想像Egret Wing那样在上方titlebar最右边上面增加一个menu(这个menu相对于一个按钮,当点击这个按钮时会出现一个window弹框,这个window弹框里 ...

  9. vue学习路由嵌套

    1. 路由嵌套和参数传递 传参的两种形式: a.查询字符串:login?name=tom&pwd=123 {{$route.query}} ------ <li><route ...

  10. python基础学习第一天

    def用法 函数定义的基本格式如下: def function(params):     somthing     return values 说明:return语句可选,出现return语句表示函数 ...