用 gdb 和 qemu 调试 grub
因为qemu内置了gdbserver,所以我们可以用gdb调试qemu虚拟机上执行的代码,而且不受客户机系统限制。
以下内容是我调试 grub 0.97 时的一份笔记。
准备
qemu, gdb,以及一份带grub的虚拟机镜像,一份grub源码。
调试过程
启动虚拟机
$ sudo qemu-system-x86_64 -s -S -m -hda test.img
然后使用gdb连接
$ gdb
(gdb) target remote localhost:
(gdb) set architecture i8086
(gdb) break *0x7c00
(gdb) cont
一开始CPU是工作在实模式下,为了gdb显示正常我们把架构设置为i8086
BIOS会把MBR加载到内存0x7c00处,我们在这里下断点,然后执行
查看一下当前的反汇编代码
(gdb) x/4i $pc
=> 0x7c00: jmp 0x7c4a
0x7c02: nop
0x7c03: add %al,(%bx,%si)
0x7c05: add %al,(%bx,%si)
显示的是 att 风格的汇编代码,如果不习惯可以切换成 intel 风格的。
(gdb) set disassembly-flavor intel
(gdb) x/4i $pc
=> 0x7c00: jmp 0x7c4a
0x7c02: nop
0x7c03: add BYTE PTR [bx+si],al
0x7c05: add BYTE PTR [bx+si],al
上来就是一个无条件跳转,我们先执行一步,再查看下代码。
(gdb) ni
(gdb) x/8i $pc
=> 0x7c4a: cli
0x7c4b: nop
0x7c4c: nop
0x7c4d: test dl,0x80
0x7c50: jne 0x7c54
0x7c52: mov dl,0x80
0x7c54: jmp 0x0:0x7c59
0x7c59: xor ax,ax
在gdb里查看汇编代码不够方便,我们试着把MBR提取出来,再用IDA打开。
$ sudo dd if=/dev/sda of=mbr.hex bs= count=
对照一下grub的源码,大致能推断出这个就是stage1的代码。
其他几个常用的gdb命令
单步步入
(gdb) si
查看断点
(gdb) info breakpoints
删除断点
(gdb) delete
grub 启动过程总结
阶段:stage1
数据来源:MBR
内存地址:0x7c00
源码:/stage1/stage1.S
这段代码的作用就是加载MBR之后的1个扇区到0x2000处。
阶段:stage1.5
数据来源:MBR之后的几个扇区
内存地址:0x2000
源码:/stage2/start.S
这段代码的作用是把stage1.5剩余的扇区加载到0x2200,因为stage1只加载了stage1.5的第一个扇区。
源码:/stage2/asm.S
这段代码的作用是初始化部分环境,最后调用 init_bios_info
源码:/stage2/common.c
这段代码的作用是初始化c语音环境,最后调用 cmain
源码:/stage2/stage1_5.c
这段代码的作用是加载stage2到0x8000处,然后跳转到0x8200执行。
阶段:stage2
数据来源:/boot/grub/stage2
内存地址:0x8000
源码:/stage2/stage2.c等
后面就是grub的主要功能,显示菜单,启动客户系统等。
客户机的Linux内核是加载到0x100000内存地址。
用 gdb 和 qemu 调试 grub的更多相关文章
- 使用QEMU调试Linux内核代码
http://blog.chinaunix.net/uid-20729583-id-1884617.html http://www.linuxidc.com/Linux/2014-08/105510. ...
- GDB中汇编调试
GDB中汇编调试 1.输入代码 2.使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,时遇到问题使用-m32指令报错,参考卢肖明同学博客知道这是 ...
- 使用Qemu调试内核
利用Qemu进行内核源码级调试 http://blog.csdn.net/gdt_a20/article/details/7231652 用Qemu调试Linux内核 http://blog.chin ...
- GDB + gdbserver 远程调试android native code
原文地址:GDB + gdbserver 远程调试android native code 作者:tq08g2z 以调试模拟器中的native library code为例. Host: ubuntuT ...
- 利用GDB进行多线程调试
一.多线程调试 多线程调试重要就是下面几个命令: info thread 查看当前进程的线程. thread <ID> 切换调试的线程为指定ID的线程. break file.c:100 ...
- 3、利用GDB进行程序调试
本文将用一个实际例子讲解如何通过GDB进行程序调试. 首先,我们需要理解的是GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,其产生和调试的目的是让调试者知道,程序在执行时内部发生了什么 ...
- Lua中如何实现类似gdb的断点调试--01最小实现
说到Lua代码调试,最常用的方法应该就是加一堆print进行打印.print大法虽好,但其缺点也是显而易见的.比如效率低下,需要修改原有函数内部代码,在每个需要的地方添加print语句,运行一次只能获 ...
- ucore lab1练习2 qemu+gdb 不能协作调试的问题make lab1-mon
本练习是qemu结合gdb调试,但是我做实验的时候并不能像视频输入make lab1-mon那样顺利调试,期间有各种error,后来我找到原因,请看解决方法. 请先把ucore_lab文件删除,以下全 ...
- 手把手教你使用eclipse+qemu+gdb来单步调试ARM内核【学习笔记】
平台信息:linux4.0 平台:qemu 作者:庄泽彬 说明:笨叔叔的Linux视频的笔记 一.编译linux源码 export CROSS_COMPILE=arm-linux-gnueabi- e ...
随机推荐
- 256. Paint House房屋染色
[抄题]: There are a row of n houses, each house can be painted with one of the three colors: red, blue ...
- fastdfs 有用 新增tracker或storage
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合以文件为载体的在线服务,如相 ...
- 洛谷 P3112 [USACO14DEC]后卫马克Guard Mark
题目描述 Farmer John and his herd are playing frisbee. Bessie throws the frisbee down the field, but it' ...
- [SoapUI] 比较两个不同环境下的XML Response, 从外部文件读取允许的偏差值,输出结果到Excel
import static java.lang.Math.* import java.text.NumberFormat import java.awt.Color import com.eviwar ...
- 实践作业4---DAY2阶段一。
由于CSDN博客没有班级博客栏目,所以在该项功能上无法与博客园进行对比,我们将就CSDN和博客园的博文发布功能进行对比.我们就CSDN和博客园的博文发布页面.后台管理界面.发布新博客及界面进行了全面的 ...
- es学习-重建索引
url:POST http://127.0.0.1:9200/_reindex 参数: {"source":{"index":"myes"} ...
- myisam,innodb和memory的区别
1.myisam,innodb和memory的区别如下: 2:InnoDB存储引擎2.1:InnoDB具有事务,回滚,崩溃修复能力和多版本并发的事务安全2.2:关于InnoDB的auto_increm ...
- https hsts 私密链接
chrome强制转跳https,删除对某个域名的强制转跳即可 hrome的地址栏输入:chrome://net-internals/#hsts 在Delete domain下输入相对应的网址,不带 ...
- WordPaster2项目变化
1.1.1. jsp 1.引入json2.min.js 2.控件名称改为WordPasterManager 3.文件保存逻辑更新,直接使用控件生成的文件名称 1.1.2. asp.net 1.引入js ...
- 浅谈https\ssl\数字证书
全球可信的SSL数字证书申请:http://www.shuzizhengshu.com 在互联网安全通信方式上,目前用的最多的就是https配合ssl和数字证书来保证传输和认证安全了.本文追本溯源围绕 ...