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

《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变量

运行结果如下:

时间: 2024-10-03 13:44:44

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

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

20165115 2017-2018-2 <Java程序设计>第四周学习总结 教材学习内容总结 第五章主要是围绕子类的继承展开,并在此基础上介绍了一系列的方法与关键字.第六章主要讲述的内容是接口的实现. 代码托管 上周考试错题总结 完成后补充 参考资料 Java学习笔记(第8版) <Java学习笔记(第8版)>学习指导 ... 原文地址:https://www.cnblogs.com/zcy20165115/p/8643294.html

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

20165318 2017-2018-2 <Java程序设计>第四周学习总结 IDEA安装 按照娄老师Intellj IDEA 简易教程,我下载了IDEA但是由于没有注册学校邮箱,我没办法申请免费使用,我在网上找到了IntelliJ Idea 2017 注册码 免费激活方法顺利安装并运行了IDEA. 教材学习总结 第五章 子类与继承 每个子类只能有一个父类,而一个父类可以有多个子类.可以使用关键字extends来定义一个类的子类: class 子类名 extends 类在不加extends关键

20172330 2017-2018-1 《Java程序设计》第四周学习总结

20172330 2017-2018-1 <Java程序设计>第四周学习总结 教材学习内容总结 这一周的内容还是比较多的,而且很复杂,包含第四和第七章. 第四章向我们介绍了类结构的定义与概念,同时举出了好多个例题向我们展示自定义类的方法与应用,对于方法定义的结构与用途进行了讨论:包括return语句,参数,局部数据等方面. 第七章的主要内容则是面向对象设计.通过书本的介绍了,我们探讨了面向对象软件设计的主要问题,了解了确定程序所需要的类和对象的技术,对类之间的关系进行了探讨,详细的学习了sta

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

20172325 2016-2017-2 <Java程序设计>第四周学习总结 教材学习内容总结 1.对类.对象.声明变量的定义和属性有了进一步的了解 2.学会如何编写一个类并运用到需要的程序中 3.学习了形参和实参的概念和区别 4.修饰符的作用和运用,例如public和private 5.学习了静态类,例如静态方法和静态变量 6.关于封装的作用和运用 7.在面向对象的程序设计时需要做的必要步骤,包括需求.设计.实现和测试 8.对枚举类的进一步了解 9.学习了调用方法中的方法重载 10.UML类

张季跃 201771010139《面向对象程序设计(java)》第十四周学习总结

张季跃 201771010139<面向对象程序设计(java)>第十四周学习总结 第二部分:实验部分 1.实验目的与要求 (1) 掌握GUI布局管理器用法: (2) 掌握各类Java Swing组件用途及常用API: 实验1: 导入第12章示例程序,测试程序并进行组内讨论. 测试程序1 l 在elipse IDE中运行教材479页程序12-1,结合运行结果理解程序: l 掌握各种布局管理器的用法: l 理解GUI界面中事件处理技术的用途. l 在布局管理应用代码处添加注释: 测试结果:   测

# 20175227张雪莹 2018-2019-2 《Java程序设计》第四周学习总结

20175227张雪莹 2018-2019-2 <Java程序设计>第四周学习总结 教材学习内容总结 一.子类和父类. 1.子类只继承父类中的protected和public访问权限的成员变量(方法)作为子类的成员变量(方法). 2.若A->B->C->D, 在Other类中用D类中protected的成员变量和方法创建对象object,则两个类需处于同一个包中: 在Other类中用D类继承A类中protected的成员变量和方法创建对象object,则A类和Other类需处

20175226 2018-2019-2 《Java程序设计》第四周学习总结

20175226 2018-2019-2 <Java程序设计>第四周学习总结 教材学习内容总结 子类与父类 格式class 子类名 extends 父类名 Object类是所有类的祖先类 子类的继承性 在同一包中子类会继承非private的成员和方法 不在同一包中只会继承protected和public的成员和方法 成员变量的隐藏 子类可会将同自身变量名字相同的继承变量隐藏 子类继承方法只能操作子类继承或隐藏的变量 子类新定义的方法不能操作隐藏的成员变量 方法重写 子类中定义一个与父类方法完全

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

20175314 <Java程序设计>第四周学习总结 教材学习内容总结 每个子类只能有一个父类,而一个父类可以有多个子类.可以使用关键字extends来定义一个类的子类:class 子类名 extends 父类名.不加extends关键字时,默认为Object类,Object类是任何类(除了本身)的祖先类.简单的说,子类拥有父类的所有(除了private类及不同包的友好类),同时可以拥有自己新的东西.子类可以通过继承的方法来操作未继承的变量.父类的方法被子类重写时,可以各自产生自己的功能行为.

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

学号 2016-2017-2 <Java程序设计>第四周学习总结 教材学习内容总结 1.子类与父类:由继承得到的类称为子类,被继承的类称为父类 2.在类的声明过程中,通常用关键字extend来定义一个类的子类 ,如 class 子类名 extend 父类名 3.如果子类和父类在同一个包中,子类继承了其父类中不是private的成员变量作为自己的成员变量,也继承了其父类中不是private的方法作为自己 的方法,继承的成员变量和方法的访问权限保持不变 4.子类对象的特点:如果子类和父类不在同一个

201671010130 2016-2017-2 《Java程序设计》第四周学习小结

第四周学习小结 本次实验巩固了上次实验分隔数并求和的题,目前这个题有两种做法,一种是不断对数10求余,余数保存在sum中,然后左移一位,直到余数为零.另一种就是将数字强制转换成一个字符串数组String s=String.valueOf(num),根据方法s.toCharArray()将字符分离出来,据"x"-"0"=x,unicode码值相减即可得x的值. 父类和子类能够看两个交集,super关键字是否能够看做一个子类和超类的接口呢? 在子类中可以增加域.增加方法