《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. shell基本语法记录

    Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个 ...

  2. July 10th, Week 29th Sunday, 2016

    Everything is good when new, but friend when old. 老朋友更醇香. When did you meet with your last friends l ...

  3. css给列表添加序号

    .middle ul{ counter-reset: show-list; } li{ padding-left: 30px; line-height: 1.3; position: relative ...

  4. Usaco 2019 Jan Platinum

    Usaco 2019 Jan Platinum 要不是昨天老师给我们考了这套题,我都不知道usaco还有铂金这么一级. 插播一则新闻:杨神坚持认为铂金比黄金简单,原因竟是:铜 汞 银 铂 金(金属活动 ...

  5. 牛客小白D题(STL的迭代器)

    「只要我拉动绳线,你就得随之起舞.」          ——泰兹瑞        泰兹瑞来到卡拉德许之后,由于他精湛的神器制造技术,可谓是过的如鱼得水.这次,他为自己打造了一个编辑器,称为威穆(Vei ...

  6. windos 系统文件包含

    解决VS2013找不到windows.h文件方法 右键属性管理器添加 包含路径(依据sdk安装目录,我的是64位系统) C:\Program Files (x86)\Microsoft SDKs\Wi ...

  7. oracle批量插入数据(测试)

    做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入,那会浪费大量的时间,本文介绍了Oracle中如何通过一条 SQL快速生成大量的测试数据的方法.产生测试数据的SQ ...

  8. docker安装与卸载

    文章转自:https://www.cnblogs.com/yufeng218/p/8370670.html  (EE安装) https://blog.csdn.net/jxyzh11/article/ ...

  9. python3打包成exe---pyinstaller方法

    前言: 主要介绍python3的pyinstaller打包方法 pyinstaller安装参考地址:http://www.pyinstaller.org/ pywin32的下载地址:https://s ...

  10. Bellman_ford模板

    参考博客: https://blog.csdn.net/u011893609/article/details/81232124 https://blog.csdn.net/bestsort/artic ...