
gdbstub可以使得Bochs程序在本地1234网络端口侦听接收gdb的命令,并且向gdb发送命令执行结果。从而我们可以利用gdb对Linux 011内核进行C语言级的调试。当然,Linux 011内核也需要进行使用-g选项重新编译。
14131 编译带gdbstub的Bochs系统{j,
Bochs用户手册中介绍了自行编译Bochs系统的方法。这里我们给出编译带gdbstub的Bochs系统的方法和步骤。首先从下面网站下载最新Bochs系统源代码(例如:bochs-22targz):U
使用tar对软件包解压后会在当前目录中生成一个bochs-22子目录。进入该子目录后带选项“--enable-gdb-stub”运行配置程序configure,然后运行make和make install即可,见如下所示:
[root@plinux bochs-22]# /configure --enable-gdb-stubI0B%
checking build system type i686-pc-linux-gnu7tY
checking host system type i686-pc-linux-gnuQ
checking target system type i686-pc-linux-gnu{
©OldLinux论坛 -- 有关早期Linux内核代码发展的论坛。M
[root@plinux bochs-22]# makeQ
[root@plinux bochs-22]# make installN
©OldLinux论坛 -- 有关早期Linux内核代码发展的论坛。ufVz
若在运行/configure时我们碰到一些问题而不能生成编译使用的Makefile文件,那么这通常是由于没有安装X window开发环境软件或相关库文件造成的。此时我们就必须先安装这些必要的软件。>1z<z
14132 编译带调试信息的Linux 011内核"jmg
通过把Bochs的模拟运行环境与gdb符号调试工具联系起来,我们既可以使用Linux 011系统下编译的带调试信息的内核模块来调试,也可以使用在RedHat 9环境下编译的011内核模块来调试。这两种环境下都需要对011内核源代码目录中所有Makefile文件进行修改,即在其中编译标志行上添加-g标志,并去掉链接标志行上的-s选项:2
LDFLAGS = -M -x // 去掉 -s 标志。XJFU)Y
CFLAGS =-Wall -O -g -fomit-frame-pointer / // 添加 -g 标志。iMN
进入内核源代码目录后,利用find命令我们可以找到以下所有需要修改的Makefile文件:_6
[root@plinux linux-011]# find / -name MakefileSn^
/fs/Makefile-
/kernel/Makefile/"`p%
/kernel/chr_drv/Makefile(pyM
/kernel/math/MakefileV
/kernel/blk_drv/Makefiles/CDu
/lib/Makefile[x~
/Makefile980
/mm/Makefile/zb
[root@plinux linux-011]#S9/Q
另外,由于此时编译出的内核代码模块中含有调试信息,因此system模块大小可能会超过写入内核代码映像文件的默认最大值SYSSIZE = 0x3000(定义在boot/bootsects文件第6行)。我们可以按以下方法修改源代码根目录中的Makefile文件中产生Image文件的规则,即把内核代码模块system中的符号信息去掉后再写入Image文件中,而原始带符号信息的system模块保留用作gdb调试器使用。注意,目标的实现命令需要以一个制表符(TAB)作为一行的开始。pP
Image: boot/bootsect boot/setup tools/system tools/build)=1
cp -f tools/system systemtmp=-&a
strip systemtmphQ6n0S
tools/build boot/bootsect boot/setup systemtmp $(ROOT_DEV) $(SWAP_DEV) > ImageA-)
rm -f systemtmpY3w[/@
sync9=P2n
©OldLinux论坛 -- 有关早期Linux内核代码发展的论坛。KuEo
当然,我们也可以把boot/bootsects和tools/buildc中的SYSSIZE值修改成0x8000来处理这种情况。ag4
14133 调试方法和步骤;M]3!
下面我们根据在现代Linux系统(例如RedHat 9)系统上和运行在Bochs中Linux 011系统上编译出的内核代码分别来说明调试方法和步骤。
1 调试现代Linux系统上编译出的Linux 011内核E
假设我们的Linux 011内核源代码根目录是linux-rh9-gdb/,则我们首先在该目录中按照上面方法修改所有Makefile文件,然后在linux-rh9-gdb/目录下创建一个bochs运行配置文件并下载一个配套使用的根文件系统映像文件。我们可以直接从网站下载已经设置好的如下软件包来做实验:
使用命令“tar zxvf linux-gdb-rh9-050619targz”解开这个软件包后,可以看到其中包含以下几个文件和目录:MX{-
©OldLinux论坛 -- 有关早期Linux内核代码发展的论坛。X
[root@plinux linux-gdb-rh9]# ll'5tfq
total 1600bJT~Q
-rw-r--r-- 1 root root 18055 Jun 18 15:07 bochsrc-fd1-gdbbxrcf%J2s
drwxr-xr-x 10 root root 4096 Jun 18 22:55 linux[dM&
-rw-r--r-- 1 root root 1474560 Jun 18 20:21 rootimage-011-for-orig8EIChk
-rwxr-xr-x 1 root root 35 Jun 18 16:54 run{gj
[root@plinux linux--gdb-rh9]#t|f
这里的bochs配置文件与其他Linux 011配置文件的主要区别是在文件头部添加有以下一行内容,表示当bochs使用这个配置文件运行时将在本地网络端口1234上侦听gdb调试器的命令:NhL
gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0J,i/6
运行这个实验的基本步骤如下:@EkQ
(1)启动X window系统后打开两个终端窗口;(mPN
(2)在一个窗口中,把工作目录切换进linux-gdb-rh9/目录中,并运行程序“/run”,此时该窗口中会显示一条等待gdb来连接的信息:“Wait for gdb connection on localhost:1234”,并且系统会创建一个Bochs主窗口(此时无内容);1P=VI<
(3)在另一个窗口中,我们把工作目录切换到内核源代码目录中linux-gdb-rh9/linux/,并运行命令:“gdb tools/system”;iDqm8
(4)在运行gdb的窗口中键入命令“break main”和“target remote localhost:1234”,此时gdb会显示已经连接到Bochs的信息;p
(5)在gdb环境中再执行命令“cont”,稍过一会gdb会显示程序停止在init/mainc的main()函数处。v3L2
下面是运行gdb和在其中执行的一些命令示例。[2;jS
[root@plinux linux]# gdb tools/system hI/
GNU gdb Red Hat Linux (53post-02002112918rh)!mC}
Copyright 2003 Free Software Foundation, Inc|3
GDB is free software, covered by the GNU General Public License, and you areC$NY4
welcome to change it and/or distribute copies of it under certain conditionsboNdAL
Type "show copying" to see the conditions3[nfHW
There is absolutely no warranty for GDB Type "show warranty" for details'1-V
This GDB was configured as "i386-redhat-linux-gnu"Oq&[
(gdb) break main }<;
Breakpoint 1 at 0x6621: file init/mainc, line 110+%!]{
(gdb) target remote localhost:12342 yc
Remote debugging using localhost:1234X6X&7
0x0000fff0 in sys_mkdir (pathname=0x0, mode=0) at nameic:481(
481 nameic: No such file or directory5QU
in nameic&%P'
(gdb) cont Pv'/S$
ContinuingP:O_{
Breakpoint 1, main () at init/mainc:110
110 ROOT_DEV = ORIG_ROOT_DEV;T7PkpD
(gdb) list 5XT
105 { / The startup routine assumes (well, ) this /2L$
106 /_c
107 Interrupts are still disabled Do necessary setups, then)Z0k
108 enable themjZ@+wn
109 /u
110 ROOT_DEV = ORIG_ROOT_DEV;d&!`
111 drive_info = DRIVE_INFO;#yRW,
112 memory_end = (1<<20) + (EXT_MEM_K<<10);9Uaw
113 memory_end &= 0xfffff000;`v8fAR
114 if (memory_end > 1610241024)lA#
(gdb) next DHzM
111 drive_info = DRIVE_INFO;X
(gdb) next +S:q
112 memory_end = (1<<20) + (EXT_MEM_K<<10);iXdDt
(gdb) print /x ROOT_DEV <W<
$3 = 0x21d }{%Q
(gdb) quit |
The program is running Exit anyway (y or n) yt
[root@plinux linux]#lixBs
=====================================================
141 利用bochs调试内核%UU
Bochs具有非常强大的 *** 作系统内核调试功能。这也是本文选择Bochs作为首选实验环境的主要原因之一。有关Bochs调试功能的说明参见前面142节,这里基于Linux 011内核来说明Windows环境下Bochs系统调试 *** 作的基本方法。m[2
1411 运行Bochs调试程序g8O
我们假设Bochs系统已被安装在目录“C:/Program Files/Bochs-211/”中,并且Linux 011系统的Bochs配置文件名称是bochsrc-hdbxrc。现在在包含内核Image文件的目录下建立一个简单的批处理文件runbat,其内容如下:R
"C:/Program Files/Bochs-211/bochsdbg" -q -f bochsrc-hdbxrcjFypV+
其中bochsdbg是Bochs系统的调试执行程序。运行该批处理命令即可进入调试环境。此时Bochs的主显示窗口空白,而控制窗口将显示以下类似内容:D8v~
C:/Documents and Settings/john1/桌面/Linux-011>"C:/Program Files/Bochs-211/boRW6RNY
chsdbg" -q -f bochsrc-hdbxrc2
========================================================================`)2os
Bochs x86 Emulator 2113$O@R
February 08, 2004x2
========================================================================/26c3(
00000000000i[ ] reading configuration from bochsrc-hdbxrcq4
00000000000i[ ] installing win32 module as the Bochs GUI4UW
00000000000i[ ] Warning: no rc file specified1dsv
00000000000i[ ] using log file bochsouttxtmM
Next at t=0
(0) context not implemented because BX_HAVE_HASH_MAP=0c
[0x000ffff0] f000:fff0 (unk ctxt): jmp f000:e05b ; ea5be000f0g$
<bochs:1>i/
此时Bochs调试系统已经准备好开始运行,CPU执行指针已指向ROM BIOS中地址0x000fffff0处的指令处。其中'<bochs:1>'是命令输入提示符,其中的数字表示当前的命令序列号。在命令提示符'<bochs:1>'后面键入'help'命令,可以列出调试系统的基本命令。若要了解某个命令的具体使用方法,可以键入'help'命令并且后面跟随一个用单引号括住的具体命令,例如:“help 'vbreak'”,如下面所示。V7
<bochs:1> help@n{L(
help - show list of debugger commands5&6^
help 'command'- show short command description~B
-- Debugger control --e!/;l
help, q|quit|exit, set, instrument, show, trace-on, trace-off,u7J
record, playback, load-symbols, slistr2:
-- Execution control --pOHjE
c|cont, s|step|stepi, p|n|next, modebpj
-- Breakpoint management --|EQ
v|vbreak, lb|lbreak, pb|pbreak|b|break, sb, sba, blist,dL/rBI
bpe, bpd, d|del|deleteyR%|
-- CPU and memory contents --xsMy
x, xp, u|disas|disassemble, r|reg|registers, setpmem, crc, info, dump_cpu,@|'p
set_cpu, ptime, print-stack, watch, unwatch, |calc7
<bochs:2> help 'vbreak'_t<#o
help vbreak/
vbreak seg:off - set a virtual address instruction breakpoint0
<bochs:3>flx+
为了让Bochs直接模拟执行到Linux的引导启动程序开始处,我们可以先使用断点命令在0x7c00处设置一个断点,然后让系统连续运行到0x7c00处停下来。执行的命令序列如下:Xfk
<bochs:3> vbreak 0x0000:0x7c00hDzuWy
<bochs:4> cfMH/'X
(0) Breakpoint 1, 0x7c00 (0x0:0x7c00))W&
Next at t=4409138<-0m5
(0) [0x00007c00] 0000:7c00 (unk ctxt): mov ax, 0x7c0 ; b8c007b 03
<bochs:5>3R28Q
此时,CPU执行到boots程序开始处的第1条指令处,Bochs主窗口将显示出“Boot From floppy”等一些信息。现在,我们可以利用单步执行命令's'或'n'(不跟踪进入子程序)来跟踪调试程序了。在调试时可以使用Bochs的断点设置命令、反汇编命令、信息显示命令等来辅助我们的调试 *** 作。下面是一些常用命令的示例:J'P
<bochs:8> u /10 # 反汇编从当前地址开始的10条指令。,S/2
00007c00: ( ): mov ax, 0x7c0 ; b8c007Wvl
00007c03: ( ): mov ds, ax ; 8ed8)1f
00007c05: ( ): mov ax, 0x9000 ; b80090WmD1
00007c08: ( ): mov es, ax ; 8ec0(`|
00007c0a: ( ): mov cx, 0x100 ; b90001iW1|1
00007c0d: ( ): sub si, si ; 29f6ze_QZY
00007c0f: ( ): sub di, di ; 29ffZStl
00007c11: ( ): rep movs word ptr [di], word ptr [si] ; f3a5=yF
00007c13: ( ): jmp 9000:0018 ; ea18000090!sPR9
00007c18: ( ): mov ax, cs ; 8cc8(
<bochs:9> info r # 查看当前CPU寄存器的内容aM>/D
eax 0xaa55 436057a@`_
ecx 0x110001 1114113/$3$K"
edx 0x0 00j3G
ebx 0x0 0gE
esp 0xfffe 0xfffee7{
ebp 0x0 0x0]lX
esi 0x0 0m
edi 0xffe4 65508TD}Zo
eip 0x7c00 0x7c00e
eflags 0x282 642Wlg
cs 0x0 0b s=]
ss 0x0 0=Z'
ds 0x0 02R;%
es 0x0 0!
fs 0x0 0BX/
gs 0x0 0D)}n{
有时对电脑使用了优化以后会造成打印后台程序不能运行,请按下法试一下,看看能不能解决: 点击“开始”->“运行”,输入“Servicesmsc”后点击“确定”,打开“服务”对话框,找到print spooler这个项目,看看其状态是不是“已启动”。如果没有“已启动”字样,可用鼠标右键点击该项,再在d出的对话框中点击“启动”即可。另外如果是“手动”再把它改成“自动”,否则即使你安装了打印机驱动也还是不能正常打印。
具体 *** 作步骤:
步骤1:安装模拟器主程序(这个就不用多说了,和普通安卓应用一样)
步骤2:将装有配置文件的sdl文件夹拷贝到机身内存根目录中(没有机身内存的手机请拷贝到sd卡中,不清楚拷贝到哪里的就用re管理器拷贝到手机根目录显示sdcard的文件夹里)
步骤3:将磁盘镜像文件改名为cimg,拷贝到步骤2中的sdl文件夹(要用什么系统就拷贝相应的镜像)
步骤4:运行安装好的模拟器主程序,没有问题的话就会开机运行 *** 作系统了
是不是你的Bochsrc没配置对啊,里面有两个文件
书上的容是:
romiamge:file=/usr/share/BIOS-boschs-latest
vgaromimage:file=/usr/share/vgabiosbin
我的电脑上就是这样的路径的
romiamge:file=/boch2xx//BIOS-boschs-latest
vgaromimage:file=/boch2xx//VGABIOS-lgpl-latest
也不晓得是不是我安装的时候改过参数还是怎么,反正我的路径就和书上的不一样,找到书上提到的那些个文件,BIOS-boschs-latest,vgabiosbin或VGABIOS-lgpl-latest,换过就行了
具体 *** 作步骤:
步骤1:安装模拟器主程序(这个就不用多说了,和普通安卓应用一样)
步骤2:将装有配置文件的SDL文件夹拷贝到机身内存根目录中(没有机身内存的手机请拷贝到SD卡中,不清楚拷贝到哪里的就用RE管理器拷贝到手机根目录显示sdcard的文件夹里)
步骤3:将磁盘镜像文件改名为cimg,拷贝到步骤2中的SDL文件夹(要用什么系统就拷贝相应的镜像)
步骤4:运行安装好的模拟器主程序,没有问题的话就会开机运行 *** 作系统了
以上就是关于怎么用gdb和bochs调试内核全部的内容,包括:怎么用gdb和bochs调试内核、安装好bochsh后怎么运行程序、安卓bochs怎么上网,还有怎么运行exe文件啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)