Linux内核分析:实验一

潘俊洋 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

计算机体系结构与程序运行过程

现代计算机大都采用的是“冯.诺依曼”体系结构,它的核心思想是:程序存储,指令和数据不加区分的放在一个存储器中。由指令指针寄存器保存着下一条将要执行指令的地址,这个寄存器在32位系统中叫eip,64位系统中叫rip。

指令是用二进制编码的,难于记忆。为了更有效的编写程序,人们就发明了汇编语言,它是对二进制指令的一种简单映射。平常我们所写的程序都需要编译成二进制,才能被机器执行。

实验截图:

1.开始的截图

2.mian.s的代码

3.反汇编代码

代码分析:

从main函数开始:

pushl %ebp movl %esp, %ebp

这两条指令的意思是保存栈基指针的内容,然后把栈顶指针拷贝给栈基指针。也就是把栈基指针压栈,然后使栈基指针指向栈顶指针。

这样做使得函数保存了调用之钱的状态信息,便于函数返回。函数调用堆栈逻辑上是由多个堆栈叠加起来的。

subl $4, %esp movl $23, (%esp)

这两条指令的意思是栈顶指针下以4个单位,分配了一个单元,第二条指令将数值23存储到刚刚分配的个单元中。

所以这两条指令的作用是将数值23压入堆栈。

call f

这是一条函数调用指令。call f调用f函数,首先把指令指针寄存器EIP的内容(即下一条指令的位置)保存到堆栈中,然后把函数f函数的起始地址拷贝给EIP寄存器。

pushl %ebp

movl %esp, %ebp

subl $4, %esp

movl 8(%ebp), %eax

movl %eax, (%esp)

call g 现在执行的是f函数。前两条指令和main中的前两条指令含义相同。对于第4条指令指汇编程序的变址寻址方式,

它的含义是将栈基指针的内容加上8对应的存储单元(即23所在的存储单元)的内容传送给累加寄存器EAX。下一条指令再把EAX内容拷贝给栈顶指针所指的位置。

call g调用g函数。

popl %ebp

这条指令相当于:movl (%esp),%ebp add $4,%esp。

实现将之前压入栈的栈基指针EBP的内容出栈到EBP中。

Leave:恢复堆栈状态

ret返回

总结:通过分析C程序的反汇编代码,对程序在计算内部的执行过程有了一个直观的认识,在函数调用中,栈起了举足轻重的作用,

整个程序的运行过程其实就是每次从 eip 指向的地址取出一条指令执行,然后eip自增很多计算机安全方面的漏洞都直接间接的利用了栈。

“Linux内核分析”实验报告的更多相关文章

  1. Linux内核分析实验六

    Linux内核分析实验六 进程控制块PCB——task_struct(进程描述符) 为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_s ...

  2. 【MOOC EXP】Linux内核分析实验八报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 进程的切换和系统的一般执行过程 知识点 ...

  3. 【MOOC EXP】Linux内核分析实验七报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 可执行程序的装载 知识点梳理 一.预处 ...

  4. 【MOOC EXP】Linux内核分析实验六报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 进程的描述和进程的创建 知识点梳理: ...

  5. “Linux内核分析”实验一报告

    张文俊 + 原创作品转载请注明出处 + <Linux 内核分析> MOOC 课程 实验要求: 1.总结部分要求阐明自己对“计算机是如何工作的”理解: 2.博客中需要使用实验截图: 实验内容 ...

  6. “Linux内核分析”实验二报告

    张文俊 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.第二周学习内 ...

  7. “Linux内核分析”实验三报告

    构造一个简单的Linux系统 张文俊+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10000290 ...

  8. 【MOOC EXP】Linux内核分析实验一报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000  [反汇编一个简单的C程序]   实验 ...

  9. 【MOOC EXP】Linux内核分析实验二报告

    程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000  [操作系统是如何工作的]   教学内 ...

随机推荐

  1. django中的中间件机制和执行顺序

    这片文章将讨论下面内容: 1.什么是middleware 2.什么时候使用middleware 3.我们写middleware必须要记住的东西 4.写一些middlewares来理解中间件的工作过程和 ...

  2. 使用Maven分环境打包:dev sit uat prod

    使用Maven管理的项目,经常需要根据不同的环境打不同的包,因为环境不同,所需要的配置文件不同,比如database的连接信息,相关属性等等. 在Maven中,我们可以通过P参数和profiles元素 ...

  3. MDC的使用(Mapped Diagnostic Context)的使用

    通常我们可能会有大量的任务需要提交提交到线程池执行,但是此时如果不对日志添加唯一标识进行区分的话回到错乱一坨无法进行查看.因此可以对每一天日志添加唯一的标识,例如使用userid作为日志的唯一标志.这 ...

  4. Spring Boot中使用AOP统一处理Web请求日志

    AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是Spring框架中的一个重要内容,它通 ...

  5. Git安装与配置——详细教程1

    1.下载Git客户端 想要安装Git首先要下载Git的安装包程序. Git安装包下载地址:https://git-scm.com/downloads/ 2.安装Git 双击安装程序进行安装: a. 欢 ...

  6. Matlab数据处理——数据的保存和读取方法操作

    1:dlmwrite()函数保存成txt文件 使用方法:      dlmwrite('filename', M)      使用默认分隔符“,”将矩阵M写入文本文件filename中:      d ...

  7. PAT A1076 Forwards on Weibo (30 分)——图的bfs

    Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and may ...

  8. Linux下对inode和块的理解

    基本概念 首先讲下inode和块的基本概念.在Linux系统中,文件由元数据和数据块组成.数据块就是多个连续性的扇区(sector),扇区是文件存储的最小单位(每个512字节).块(block)的大小 ...

  9. 如何通过C#开发调用Skyline软件中提供的小工具

    熟悉Skyline的朋友会知道,在TerraBuilder和TerraExplorer Pro软件的安装目录里,提供了很多个小工具(exe程序): 虽然我们看不到这些小工具的源代码,但我们还是可以在自 ...

  10. VisualStudio2008+水晶报表的使用

    1:打开VisualStudio2008,新建一个Windows窗体应用程序项目,名称可以自定义,选择项目的保存路径,然后确定 刚新建好的窗体应用程序: 2. 把准备好的水晶报表插件复制到项目中的bi ...