实验5--实现函数调用堆栈跟踪函数
需要完成kdebug.c中函数print_stackframe的实现,可以通过函数print_stackframe来跟踪函数调用堆栈中记录的返回地址。
一.函数堆栈
  主要的两点在于栈的结构和ebp寄存器的作用。一个函数调用动作可分解为:零到多个PUSH指令(用于参数入栈),一个CALL指令。CALL指令内部其实还暗含了一个将返回地址(即CALL指令下一条指令的地址)压栈的动作(由硬件完成)。几乎所有本地编译器都会在每个函数体之前插入类似如下的汇编指令:
   
  这样在程序执行到一个函数的实际命令前,已经有以下数据顺序入栈:参数,返回地址,ebp寄存器。   
  函数调用的步骤:
    1.参数入栈:将参数从右向左依次压入栈中。  
       2. 返回地址入栈:call指令内部隐含的动作,将call的下一条指令入栈,由硬件       完成。  
       3. 代码区跳转:跳转到被调用函数入口处。  
       4. 函数入口处前两条指令,为本地编译器自动插入的指令,即将ebp寄存器入栈,       然后将栈顶指针esp赋值给ebp。
  相反的,函数返回的步骤为:
    1.保存返回值,通常将函数返回值保存到寄存器EAX中。  
       2. 将当前的ebp赋给esp。  
       3. 从栈中弹出一个值给ebp。  
       4. 弹出返回地址,从返回地址处继续执行。
  并且在函数调用过程中的ebp起着关键作用,从该地址向上(栈底方向)能依次获取返回地址、参数值,向下(栈顶方向)能获取函数局部变量值,而该地址处又存储着上一层函数调用时的ebp的值,于是以此为线索可以形成递归,直至到达栈底。这就是函数调用栈。
 
二.print_stackframe函数的实现
  由以上知识和源代码文件中的注释实现print_stackframe():
   
  执行’make qemu’指令得到的结果为:
   
  可以观察到显示结果与实验指导书上一致。对于最后一行:其对应的是第一个调用堆栈的函数,即bootmain.c中的bootmain函数,因为bootloader设置的堆栈从0x7c00开始,执行’call bootmain’转入bootmain函数。其ebp=0x00007bf8,此时的eip=0x00007d6e,其压入的4个参数分别为0xc031fcfa, 0xc08ed88e, 0x64e4d08e, 0xfa7502a8。

转载于:https://www.cnblogs.com/FrankChen831X/p/10733836.html

ucore-lab1-练习5report相关推荐

  1. 《ucore lab1 练习5》实验报告

    [练习5]实现函数调用堆栈跟踪函数 我们需要在lab1中完成kdebug.c中函数print_stackframe的实现,可以通过函数print_stackframe来跟踪函数调用堆栈中记录的返回地址 ...

  2. ucore lab1 实验报告

    UCORE LAB1 实验报告 练习一 理解通过make生成执行文件的过程 1.操作系统镜像文件ucore.img是如何一步一步生成的? 先打开lab1文件夹下的Makefile,查看里面的代码,在各 ...

  3. 操作系统 ucore lab1

    操作系统 ucore lab1 实验目的 操作系统是一个软件,也需要通过某种机制加载并运行它.在这里我们将通过另外一个更加简单的软件-bootloader来完成这些工作.为此,我们需要完成一个能够切换 ...

  4. 操作系统实验—ucore Lab1

    一.内容 通过 Lab1 中的 bootloader 可以从实模式切换的保护模式,然后再读取磁盘并加载 ELF 文件以加载 OS 操作系统,操作系统能够读入字符并显示到屏幕上,具体内容如下: 练习 1 ...

  5. 操作系统ucore lab1实验报告

    操作系统lab1实验报告 [练习1] 理解通过 make 生成执行文件的过程.(要求在报告中写出对下述问题的回答) 在此练习中,大家需要通过阅读代码来了解: 1. 操作系统镜像文件 ucore.img ...

  6. 《ucore lab1 exercise5》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 题目:实现函数调用堆栈跟踪函数 我们需要在lab1中完成kdebug.c中函数print_stackframe的实现,可以通过函数print_s ...

  7. 操作系统 ucore lab1 练习2-6

    [练习2] 使用qemu执行并调试lab1中的软件 进行如下的小练习: 从CPU加电后执行的第一条指令开始,单步跟踪BIOS的执行. 在初始化位置0x7c00设置实地址断点,测试断点正常. 从0x7c ...

  8. ucore lab1

    [练习1] [练习1.1] 操作系统镜像文件 ucore.img 是如何一步一步生成的?(需要比较详细地解释 Makefile 中每一条相关命令和命令参数的含义,以及说明命令导致的结果) 输入make ...

  9. ucore lab1学习笔记整理

    前置知识 ucore是运行在80386这一32位x86架构的CPU,汇编采用的格式是AT&T, lab1 ucore开始执行makefile会生成磁盘映像,这个磁盘映像就是对应着现实计算机中的 ...

  10. ucore lab1 任务六

    任务六: 1.首先要明白什么是函数调用堆栈(上网查资料) 分析下述代码的堆栈调用 int Add(int x, int y) { return x + y; } void main() { int * ...

最新文章

  1. python查看包的安装路径_查看python包的安装路径,检查安装路径设置。Python包的Python来自,从中,检测...
  2. 添加三维动画 demo
  3. imp导入时触发器的状态
  4. 从“执行新过程新增5%的工作量”看新过程引入
  5. RPM安装包-Spec文件參数具体解释与演示样例分析
  6. 【Linux】一步一步学Linux——nm命令(250)
  7. 燕山大学计算机学院官网,燕山大学信息科学与工程学院(专业学位)计算机技术保研夏令营...
  8. echo添加换行 linux_在 Linux 上创建文件的 10 个方法
  9. 重写报销流程,责任链模式实现
  10. linux 编码转换-转
  11. 表结构设计器(EZDML)1.98版公布
  12. 谈谈js中的异步编程。
  13. 诺奖经济大师,数学天才赌徒,和“神秘的股市财富公式”
  14. 动态iptables 防火墙
  15. 读《About Face 4 交互设计精髓》8
  16. EZo UIBuilder中嵌入微博分享按钮【实例】
  17. va_list 使用总结
  18. 手把手教你读懂源码,View事件的注册和接收详细剖析
  19. Camstar CDO增加自定义字段
  20. qq里面cap字符_特殊符号大全

热门文章

  1. Flink批处理优化器之数据属性
  2. UVA 10069 Distinct Subsequences(DP)
  3. 华为呼叫中心解决方案学习笔记一(方案概述)
  4. 条款33:避免遮掩继承而来的名称
  5. javascript获取当前时间
  6. zend studio常见问题解答
  7. Android用户界面设计“.NET研究”:框架布局
  8. mac osx 上Eclipse/CDT问题及解决方案
  9. postgresql 目录结构
  10. 回溯法解决工作分配问题及分析