Bochs是一个x86硬件平台的开源模拟器。它可以模拟各种硬件的配置。Bochs模拟的是整个PC平台,包括I/O设备、内存和BIOS。更为有趣的是,甚至可以不使用PC硬件来运行Bochs。事实上,它可以在任何编译运行Bochs的平台上模拟x86硬件。通过改变配置,可以指定使用的CPU(386、486或者586),以及内存大小等。一句话,Bochs是电脑里的“PC”。根据需要,Bochs还可以模拟多台PC,此外,它甚至还有自己的电源按钮。
bochs模拟器安装使用教程:
1、首先,下载Bochs应用,将以下2个文件移至手机SD卡根目录。
bochs模拟器怎么用?bochs模拟器安装使用教程
2、之后将XP的镜像转到刚刚移动的SDL文件夹内。
bochs模拟器怎么用?bochs模拟器安装使用教程
3、该镜像命名方式必须为“andows.img”并且,该目录下有且只能有一个镜像,不支持多系统启动(比如说放一个95/98啥的)。
bochs模拟器怎么用?bochs模拟器安装使用教程
4、之后,将SDL文件夹内的 bochsrc.txt文件打开,找到“megs:64”,这个代表虚拟机的运行内存,我们需要将其设置为我们手机内存的一半,如果你的手机是1G内存,那么这里就改成512即可。你的手机内存越大,XP系统在你手机上运行的速度就越快!
bochs模拟器怎么用?bochs模拟器安装使用教程
5、之后返回手机根目录,穿件一个“HDD文件夹”,这样进入XP系统会看到多一个盘符,以后想安装啥东西就往那个盘符里存就成了。
bochs模拟器怎么用?bochs模拟器安装使用教程
6、找到刚刚安装好的“bochs.apk”应用,打开就自动启动并运行了!PS.如果你的没有进入XP,出现一堆字有一个正常启动什么的,就点击下就成了,它就能自动进入了,我这里是没按什么,就自动进去了。
载入速度太快,连续重启2次都没拍到,大家将就下吧!(点击可查看大图)
bochs模拟器怎么用?bochs模拟器安装使用教程
7、等待走进度条吧,依照手机内存大小决定速度快慢,这512m的手机,速度个人感觉有点慢,推荐1G以上内存体验。
bochs模拟器怎么用?bochs模拟器安装使用教程
8、进度条走袜搭完之后,就能看到启动界面了。
bochs模拟器怎么用?bochs模拟器安装使用告链拿教程
9、完全载入后的样子。
bochs模拟器怎么用?bochs模拟器安装使用教程
10、E盘就是我们刚刚创建的那个HDD文件夹了。
bochs模拟器怎么用?bochs模拟器安装使用教程
11、此次系统的版本号。
bochs模拟器怎么用?bochs模拟器安装使用教程
至此XP就安装到我们的手机或者平板中去了,上面是以手机为例来进行尝鲜的。总体感觉还是不错的,如果你的手机支持OTG的话,来一个无线键鼠 *** 唤简作也是完全没问题的(可能平板体验更加)。
gdbstub可以使得Bochs程序在本地1234网络端口侦听接收gdb的命令,并且向gdb发送命令执行结果。从而我们可以利用gdb对Linux 0.11内核进行C语言级的调试。当然,Linux 0.11内核也需要进行使用-g选项重新编译。14.13.1 编译带gdbstub的Bochs系统{.j,
Bochs用户手册中介绍了自行编译Bochs系统的方法。这里我们给出编译带gdbstub的Bochs系统的方法和步骤。首先从下面网站下载最新Bochs系统源代码(例如:bochs-2.2.tar.gz):U
使用tar对软件包解压后会液昌锋在当前目录中生成一个bochs-2.2子目录。进入该子目录后带选项“--enable-gdb-stub”运行配置程序configure,然后运行make和make install即可,见如下所示:
[root@plinux bochs-2.2]# ./configure --enable-gdb-stubI0B%
checking build system type... i686-pc-linux-gnu7.tY.
checking host system type... i686-pc-linux-gnuQ
checking target system type... i686-pc-linux-gnu{
...©OldLinux论坛 -- 有关早期Linux内核代码发展的论坛。迅孙M
[root@plinux bochs-2.2]# makeQ
[root@plinux bochs-2.2]# make installN?
©OldLinux论坛 -- 有关早期Linux内核代码发展的论坛。ufVz
若在运行./configure时我们碰到一些问题而不能生成编译使用的Makefile文件,那么这通常是由于没有安装X window开发环境软件或相关库文件造成的。此时我们就必须先安装这些必要的软件。>1z<z
14.13.2 编译带调试信息的Linux 0.11内核"jmg
通过把Bochs的模拟运行环境与gdb符号调试工具联系起来,我们既可以使用Linux 0.11系统下编译的带调试信息的内核模块来调试,也可以使用在RedHat 9环境下编译的0.11内核模块来调试。这两种环境下都需要对0.11内核源代码目录中所有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-0.11]# 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-0.11]#S9/Q
另外,由于此时编译出的内核代码模块中含有调试信息,因闹晌此system模块大小可能会超过写入内核代码映像文件的默认最大值SYSSIZE = 0x3000(定义在boot/bootsect.s文件第6行)。我们可以按以下方法修改源代码根目录中的Makefile文件中产生Image文件的规则,即把内核代码模块system中的符号信息去掉后再写入Image文件中,而原始带符号信息的system模块保留用作gdb调试器使用。注意,目标的实现命令需要以一个制表符(TAB)作为一行的开始。pP
Image: boot/bootsect boot/setup tools/system tools/build)=1
cp -f tools/system system.tmp=-&a
strip system.tmphQ6n0S
tools/build boot/bootsect boot/setup system.tmp $(ROOT_DEV) $(SWAP_DEV) >ImageA-)
rm -f system.tmpY3w[/@
sync9=P2n
©OldLinux论坛 -- 有关早期Linux内核代码发展的论坛。KuEo
当然,我们也可以把boot/bootsect.s和tools/build.c中的SYSSIZE值修改成0x8000来处理这种情况。a?g4
14.13.3 调试方法和步骤M]3!
下面我们根据在现代Linux系统(例如RedHat 9)系统上和运行在Bochs中Linux 0.11系统上编译出的内核代码分别来说明调试方法和步骤。
1 调试现代Linux系统上编译出的Linux 0.11内核?E
假设我们的Linux 0.11内核源代码根目录是linux-rh9-gdb/,则我们首先在该目录中按照上面方法修改所有Makefile文件,然后在linux-rh9-gdb/目录下创建一个bochs运行配置文件并下载一个配套使用的根文件系统映像文件。我们可以直接从网站下载已经设置好的如下软件包来做实验:
使用命令“tar zxvf linux-gdb-rh9-050619.tar.gz”解开这个软件包后,可以看到其中包含以下几个文件和目录:MX{-
©OldLinux论坛 -- 有关早期Linux内核代码发展的论坛。X
[root@plinux linux-gdb-rh9]# ll'*5tfq
total 1600bJT~Q
-rw-r--r--1 root root18055 Jun 18 15:07 bochsrc-fd1-gdb.bxrcf%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-0.11-for-orig8EIChk
-rwxr-xr-x1 root root 35 Jun 18 16:54 run{gj
[root@plinux linux--gdb-rh9]#t|f
这里的bochs配置文件与其他Linux 0.11配置文件的主要区别是在文件头部添加有以下一行内容,表示当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/main.c的main()函数处。v3L2
下面是运行gdb和在其中执行的一些命令示例。[2jS
[root@plinux linux]# gdb tools/systemhI/
GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)!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 conditions.boNdAL
Type "show copying" to see the conditions.3[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/main.c, line 110.+%!.]{
(gdb) target remote localhost:12342 .yc
Remote debugging using localhost:1234X6X&7
0x0000fff0 in sys_mkdir (pathname=0x0, mode=0) at namei.c:481(
481 namei.c: No such file or directory.5QU
in namei.c&%P'
(gdb) contPv'/S$
Continuing.P:O_{
Breakpoint 1, main () at init/main.c:110*
110 ROOT_DEV = ORIG_ROOT_DEVT7PkpD
(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_DEVd&!*`
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 >16*1024*1024)lA#
(gdb) next DH.zM
111 drive_info = DRIVE_INFOX
(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
=====================================================
14.1 利用bochs调试内核%UU
Bochs具有非常强大的 *** 作系统内核调试功能。这也是本文选择Bochs作为首选实验环境的主要原因之一。有关Bochs调试功能的说明参见前面14.2节,这里基于Linux 0.11内核来说明Windows环境下Bochs系统调试 *** 作的基本方法。m[2
14.1.1 运行Bochs调试程序.g8O
我们假设Bochs系统已被安装在目录“C:/Program Files/Bochs-2.1.1/”中,并且Linux 0.11系统的Bochs配置文件名称是bochsrc-hd.bxrc。现在在包含内核Image文件的目录下建立一个简单的批处理文件run.bat,其内容如下:R
"C:/Program Files/Bochs-2.1.1/bochsdbg" -q -f bochsrc-hd.bxrcjFypV+
其中bochsdbg是Bochs系统的调试执行程序。运行该批处理命令即可进入调试环境。此时Bochs的主显示窗口空白,而控制窗口将显示以下类似内容:D8v~
C:/Documents and Settings/john1/桌面/Linux-0.11>"C:/Program Files/Bochs-2.1.1/boRW6RNY
chsdbg" -q -f bochsrc-hd.bxrc2
========================================================================`)2?os
Bochs x86 Emulator 2.1.13$O@R
February 08, 2004x2
========================================================================/26c3(
00000000000i[ ] reading configuration from bochsrc-hd.bxrcq4
00000000000i[ ] installing win32 module as the Bochs GUI4UW
00000000000i[ ] Warning: no rc file specified.1dsv
00000000000i[ ] using log file bochsout.txtmM
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执行到boot.s程序开始处的第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, ax8ed8)1f*
00007c05: (): mov ax, 0x9000b80090WmD1
00007c08: (): mov es, ax8ec0(`|
00007c0a: (): mov cx, 0x100 b90001iW1|1
00007c0d: (): sub si, si29f6ze_QZY
00007c0f: (): sub di, di29ffZStl
00007c11: (): rep movs word ptr [di], word ptr [si] f3a5=yF
00007c13: (): jmp 9000:0018 ea18000090!s?PR9
00007c18: (): mov ax, cs8cc8(
<bochs:9>info r # 查看当前CPU寄存器的内容aM>/D
eax0xaa55 436057a@`_
ecx0x110001 1114113/$3$K"
edx0x0 00j3G?
ebx0x0 0gE
esp0xfffe 0xfffee7{
ebp0x0 0x0]*lX
esi0x0 0m
edi0xffe4 65508TD}Zo
eip0x7c00 0x7c00e
eflags 0x282642Wlg
cs 0x0 0b s=]
ss 0x0 0=Z'
ds 0x0 02R%
es 0x0 0!
fs 0x0 0BX/
gs 0x0 0D*)}n{
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)