《Linux内核分析》

第一章 计算机工作原理

1.1 存储程序计算机工作模型

  • 冯·诺依曼体系结构

    各种计算机体系结构需要遵从的一个“客观规律”

    • 结构图

    • 冯·诺依曼体系结构的核心是存储程序计算机。

    • 内存保存指令和数据,CPU负责解释和执行这些指令,它们通过总线连接起来。

      存储程序计算机工作原理示意图

    • 对于x86-32计算机,有一个EIP寄存器指向内存的某一条指令,EIP是自动加一的(加一条指令)。

1.2 x86-32 汇编基础

1.2.1 x86-32 CPU的寄存器

  • 开头为E的寄存器,一般是32位的。

  • 32位寄存器EAX、EBX、ECX和EDX不仅可以传送数据、暂存数据保存算数逻辑运算结果,还可以作为指针寄存器。

  • 段寄存器

  • 代码段:使用CS:EIP来准确指明一个指令的内存地址(即首先需要知道代码在哪一个代码段里,然后需要知道指令在代码段内的相对偏移地址EIP)。

  • 堆栈段:每一个进程都有自己的堆栈段。

  • 开头带R的都是指64位寄存器。

1.2.3 寻址方式和常用汇编指令

  • 最常见的汇编指令是mov指令,movb是指8位;movw是指16位;movl是指32位;movq是指64位。

  • 寻址方式

  • x86-32中的大多数指令都能直接访问内存,但还有一些指令能直接对内存操作,如mov,push/pop等。

  • 压栈:pushl表示32的push:

pushl %eax

就是把EAX寄存器的值压到堆栈栈顶。实际上是两个动作:

①把堆栈的栈顶ESP寄存器的值减4。(因为堆栈是向下增长的,所以用减指令subl,也就是在栈顶预留出一个存储单元

subl $4, %esp

②间接寻址,就是把EAX寄存器的值放到ESP寄存器所指向的地方,这时ESP寄存器已经指向预留出的存储单元。

movl %eax, (%esp)
  • 出栈:
popl %eax

从堆栈的栈顶取一个存储单元,从堆栈栈顶的位置放到EAX寄存器里。实际上也是两个动作:

①把栈顶的数值放到EAX寄存器里。

movl (%esp), %eax

②用指令addl把栈顶加4,相当于栈向上回退了一个存储单元的位置,也就是栈在收缩。

addl $4, %esp

每次执行指令pushl栈都增长,执行指令popl栈都收缩

  • call指令是函数调用,相当于两个动作:
push %eip
movl f %eip
  • ret指令是函数返回
  • EIP寄存器不能被程序员直接修改,只能通过专用指令(如call、ret和jmp等)间接修改。

1.2.4 汇编代码范例解析

以下两个片段变化的效果是一样的



以下片段稍有复杂(书P12)

1.3 汇编一个简单的C语言程序并分析其汇编指令执行过程

  • “ls”命令查看目录

vi main.c
```命令打开VIM编辑main.c文件 ![](https://img2018.cnblogs.com/blog/1800809/201909/1800809-20190921204953711-80431995.png) -

gcc main.c

echo $?


![](https://img2018.cnblogs.com/blog/1800809/201909/1800809-20190921222911758-2119304015.png) -

gcc -S -o main.s main.c -m32

在VIM编辑器中用

g/.s*/d


![](https://img2018.cnblogs.com/blog/1800809/201909/1800809-20190921223431249-1223513638.png) - 分析上述“干净”的汇编代码

1 g:

2 pushl %ebp //将EBP压栈,将位置4存到位置7;ESP也指向位置7。

3 movl %esp, %ebp //将EBP也指向位置7。

4 movl 8(%ebp), %eax //EBP变址寻址,加8,即指向位置7不动,并把位置5的内容(即立即数8)放入EAX(取出函数g的参数)。

5 addl $7, %eax //将立即数7加到EAX中,即4+7,EAX为11。

6 popl %ebp //将位置7的内容(即位置4)放回EBP(即恢复函数f的函数调用堆栈基址EBP),即EBP指向位置4;同时ESP加4,指向位置6。

7 ret //(popl%eip)将ESP所指向的内容,即行号15放入EIP,即EIP指向行号15;同时ESP加4,即指向位置5。

8 f:

9 pushl %ebp //将EBP向下移动(从EIP的位置3开始),指向位置4。

10 movl %esp, %ebp //将ESP也指向EBP的位置4。

11 subl $4, %esp //ESP减4,指向位置5。

12 movl 8(%ebp), %eax //EBP变址寻址8,向上移动两个存储单元即加两个标号的位置,即指向位置2;并将位置2存储的立即数8放到EAX中。

13 movl %eax, (%esp) //将EAX放入ESP中,即立即数8放入位置5。

14 call g //类似第22行,将ESP指向位置6,;把EIP行号15放到位置6,并指向函数g的位置即第2行。

15 leave //撤销函数堆栈,等价于=(movl %ebp,%esp和popl %ebp),即将EBP的内容(位置4)放入ESP,即ESP也指向位置4;然后把位置4的内容(即位置1)放回EBP,即EBP指向位置1;同时ESP加4,指向位置3。

16 ret //将ESP所指向的位置3的内容(即行号23)放到EIP中,即EIP指向行号23,;同时ESP加4,指向位置2。

17 main:

18 pushl %ebp //开始执行第一条指令,EIP自动加1即指向行号19;把EBP的值压栈,先将EBP指向位置1,再将EBP的值标号0。

19 movl %esp, %ebp //EIP自动加1即指向行号20;将EBP指向位置1。

20 subl $4, %esp //EIP自动加1即指向指向行号21;将ESP减4,即向下移动,指向位置2。

21 movl $4, (%esp) //EIP自动加1即指向行号22;把立即数4放入ESP,仍指向位置2(20和21行同作为压栈f函数所需参数)。

22 call f //执行此行时,EIP已经自动加1指向了下一行即指向行号23(pushl %eip),然后将函数f的开始指令放入EIP(movl f %eip),即EIP指向函数f的位置即第9行。

23 addl $1, %eax //将EAX加立即数1,即11+1,EAX的值为12,(EAX是默认存储函数返回值的寄存器)。

24 leave //撤销函数main堆栈,将EBP和ESP都指回位置1,同时把位置1存储的内容(即位置0)放到EBP,即EBP指向位置0;并ESP加4,也指向位置0。

25 ret //指令结束。



  - leave指令等价于令:

movl %ebp,%esp

popl %ebp


- enter指令等价于:

pushl %ebp

movl %esp, %ebp

2019-2020-1 20199308《Linux内核原理与分析》第二周作业的更多相关文章

  1. 2019-2020-1 20199303<Linux内核原理与分析>第二周作业

    2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...

  2. 20169219 linux内核原理与分析第二周作业

    "linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...

  3. 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

    1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...

  4. Linux内核原理与分析-第二周作业

    写之前回看了一遍秒速五厘米:如果

  5. Linux内核原理与分析-第一周作业

    本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...

  6. 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业

    前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...

  7. 2018-2019-1 20189221《Linux内核原理与分析》第一周作业

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  8. 2020-2021-1 20209307 《Linux内核原理与分析》第九周作业

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业> 这个作业的目标 & ...

  9. 2019-2020-1 20199329《Linux内核原理与分析》第十三周作业

    <Linux内核原理与分析>第十三周作业 一.本周内容概述 通过重现缓冲区溢出攻击来理解漏洞 二.本周学习内容 1.实验简介 注意:实验中命令在 xfce 终端中输入,前面有 $ 的内容为 ...

  10. 2019-2020-1 20199329《Linux内核原理与分析》第十二周作业

    <Linux内核原理与分析>第十二周作业 一.本周内容概述: 通过编程理解 Set-UID 的运行机制与安全问题 完成实验楼上的<SET-UID程序漏洞实验> 二.本周学习内容 ...

随机推荐

  1. GitHub 运用实战入门,奶妈级教学

    ## 前言: 我不会用*官方*的语言告诉你Git 是什么,对此我表示深深得歉意--在我看来像CSDN.博客园.掘金等博客交流平台就是小的“GitHub”,只不过在这里更多的是一些零零散散的笔记或者文章 ...

  2. vue 对px 做rem 自动转换

    插件:postcss 安装: npm install postcss-pxtorem vue.config.js 配置 css: { loaderOptions: { postcss: { plugi ...

  3. 新建基于STM32F103ZET6的工程-寄存器版本

    1.新建空白工程 新建一个文件夹,用来存放新建的工程文件.在这个新建的文件夹下创建MDK-PRO和OUTPUT两个子文件夹.MDK-PRO文件夹用来存放工程文件:OUTPUT用来存放工程编译器后输出的 ...

  4. (C#、JavaScript)面向对象的程序设计

    面向对象(OOP)的理解 喜欢程序的朋友们,大家应该都听过一句话"万物皆对象",感觉老牛X了. 面向对象的程序设计,它是围绕真实世界来设计程序的. 面向对象三要素:封装.继承.多态 ...

  5. Vue设置路由跳转的两种方法: <router-link :to="..."> 和router.push(...)

    一.<router-link :to="..."> to里的值可以是一个字符串路径,或者一个描述地址的对象.例如: // 字符串 <router-link to= ...

  6. SciPy - 正态性 与 KS 检验

    假设检验的基本思想 若对总体的某个假设是真实的,那么不利于或者不能支持这一假设的事件A在一次试验中是几乎不可能发生的:如果事件A真的发生了,则有理由怀疑这一假设的真实性,从而拒绝该假设: 假设检验实质 ...

  7. MySQL 在Docker下快速安装(Ubuntu 16.4)

    采用dockerhub安装 docker run -p 3306:3306 --name mysql -v /mydata/mysql/log:/var/log/mysql -v /mydata/my ...

  8. 曹工说Redis源码(3)-- redis server 启动过程完整解析(中)

    文章导航 Redis源码系列的初衷,是帮助我们更好地理解Redis,更懂Redis,而怎么才能懂,光看是不够的,建议跟着下面的这一篇,把环境搭建起来,后续可以自己阅读源码,或者跟着我这边一起阅读.由于 ...

  9. 初识docker与理解

    因最近公司的一个新项目,有一个业务场景是需要给多个甲方的服务器配置运行环境与部署,所以考虑使用docker来实现环境配置的统一 1.docker是什么 docker是一种容器虚拟化技术的实现,相当于在 ...

  10. Java第五天,API常用类,静态(static)、集合(ArrayList)、日期(Date)、日历(Calendar)的使用方法

    上文中我们学习到了Random随机数类和ArrayList<E>集合.这两个知识点都是经常用到的,那么除了这两个外,还有哪些知识点是我们所必须掌握的呢? static 使用static需要 ...