虚拟机bochs (bochsdbg,bochsgdb)准备

ubuntu 下调试linux0.11 环境搭建, 虚拟机bochs 准备
----------------------------------------
1.ubuntu 下 bochsrc 文件
----------------------------------------
00000000000p[MEM0 ] >>PANIC<< ROM: couldn't open ROM image file '/usr/share/bochs\BIOS-bochs-latest'.

看了一下, /usr/share/bochs 下有BIOS-bochs-latest 文件, 一时愣住。
用ll '/usr/share/bochs\BIOS-bochs-latest' 出现了找不到文件的结果,
立刻明白,原来是反斜杠问题.

这不怪原作者,原配置是针对windows的, 我这环境是linux.
学习就是折腾,也要会折腾!

当运行bochs -f bochsrc-fda.bxrc
会提示Insert root floppy and press ENTER,
怎样换盘呢? 点击菜单第一个图片A盘只是显示出一个差杠,显然是不行了。
不会弹出对话窗口给我们换盘。 这估计也是环境的问题。
这时点击工具栏的CONFIG
且换回bochs启动终端,选择1,然后输入 rootimage-0.11, 完成了换盘动作。
用文本代替了图形输入。

ubutu14 下 bochs, 调试linux0.11 内核
 >>PANIC<< bochsrc-fda.bxrc:36: vgaromimage directive malformed.
修改配置, 新环境下已经改了。名称变了,有的参数也不用了。

megs: 16
romimage: file=/usr/share/bochs/BIOS-bochs-latest
vgaromimage: file= /usr/share/bochs/VGABIOS-lgpl-latest
floppya: 1_44="bootimage-0.11", status=inserted
floppyb: 1_44=diskb.img, status=inserted
boot: a
log: bochsout.txt
mouse: enabled=0
display_library:sdl

bochs-bin: symbol lookup error: /usr/lib/bochs/plugins/libbx_x.so: undefined symbol: XpmCreatePixmapFromData
解决办法是配置中添加display_library:sdl, 修改了显示方式
然后. apt-get install bochs-sdl
解决显示问题。
如此便可以使用了。

----------------------------------------
2. 编译bochsdbg
----------------------------------------
在Ubuntu下,发现bochs包里竟然没有bochsdbg,要自己编译
编译出2个版本,
一个命名为bochsgdb, 调试c  
一个命名为bochsdbg. 调试汇编
apt-get source bochs
$ cd bochs-2.4.6
$ ./configure --enable-debugger --enable-disasm
$ make
编译的这个bochs 命名为bochsdbg, 见3
$ ./configure --enable-gdb-stub --enable-disasm --enable-trace-cache --enable-show-ips
$ make
编译的这个bochs 命名为bochsgdb, 见4


碰见了不少链接问题,最后被一一解决,锻炼了自己能力(主要是自己解决的),当然也依赖互联网.
记号,有如下改变,在X_LIBS 处添加
-lX11 -lXrandr -lXpm -lpthread

连接问题,不能够找到外部符号,缺少库的解决方法:
已知不能够找到的外部符号,求解缺少了哪个库!
外部符号名称->哪个头文件?->哪个包?->哪个库?
当然如果你知道这个符号在哪个库中,就简单了。

----------------------------------------
3. 用bochs 调试汇编(bochsdbg)
----------------------------------------
将/usr/local/bin/bochs 重命名为bochsdbg, 以与/usr/bin/bochs 相区分
8086
int 指令。 例如 int 10; int 13; int 21;

int 中断号
CPU执行int n指令,相当于引发一个n号中断的中断过程,
执行过程如下:
1)取中断号n;
2)标志寄存器入栈,IF=0,TF=0;
3)CS、IP入栈
4)IP=[n*4],CS=[n*4+2]

cs: 0-4k 为中断矢量表,n*4处4byte 为n号中断矢量
它记录了中断服务程序的入口地址
从此处转去执行n号中断的中断处理程序。

?0x13*4
0x4c 76
x/4 0x4c
[bochs]:
0x0000004c :    0xfe    0xe3    0x00    0xf0
(0) [0x0000000000090042] 9000:0042 (unk. ctxt): int 0x13                  ; cd13
s
(0) [0x00000000000fe3fe] f000:e3fe (unk. ctxt): jmp .-14625 (0x000faae0)  ; e9dfc6

例如: 0x13 中断,有中断矢量: 0xf000:0xe3f3.
则int 0x13 将跳转到 0xfe3f3服务程序处执行,
cs= 0xf000
ip= 0xe3f3

linux0.11 bootsect
它是由ld86 连接生成, 前32字节是minix header, 后512字节是纯二进制文件,
后512字节是要写入磁盘boot 分区的数据

   mov dx,#0x0000      ! drive 0, head 0
    mov cx,#0x0002      ! sector 2, track 0
    mov bx,#0x0200      ! address = 512, in INITSEG
    mov ax,#0x0200+SETUPLEN ! service 2, nr of sectors
    int 0x13            ! read it

setup 代码就在0 驱, 0道, 0磁头,第2扇区,长度 4个扇区
读入INITSEG:0x200 处
把内核调入0x1000:0 = 0x10000 处
    mov ax,#SYSSEG
    mov es,ax       ! segment of 0x010000
    call    read_it

代码运行在0x7c00 处, 有与地址相关的代码吗? 无.

仅有的保留磁盘扇区数是保留在代码段中的。
代码被搬移过一次。

setup.s 功能。
读了一些参数,重设置了8259,把system 搬移到0,跳入了保护模式

head.s.
    lss stack_start,%esp    ! 从stack_start 地址处读数据存入%ss:%esp



----------------------------------------
3. 用bochs 调试c(bochsgdb)
----------------------------------------
将/usr/local/bin/bochs 重命名为bochsgdb, 以与/usr/bin/bochs 相区分
于是可以用gdb-stub 调试了。
1. bochsgdb -f my.bxrc

2. gdb tools/system; b main; target remote localhost:1234;

注:
------------------------------------------------------------
用bochs 远程 gdb 调试, 遇到了下面错误, 根本无法调试!!!
------------------------------------------------------------
远程端: bochs -q -f my.bxrc
本地端:
$gdb tools/system
(gdb) b mymain
(gdb) c
Program received signal SIGTRAP, Trace/breakpoint trap.
0x000e0000 in ?? ()
(gdb) c
Continuing.

[Thread

] #1 stopped.
0x000900a0 in ?? ()
(gdb) c
Continuing.

[Thread
] #1 stopped.
0x000900a0 in ?? ()
(gdb) c
Continuing.

原因, 原来这个bochs 是不能远程gdb调试的, 提示的一点都不清楚。
我怎么查my.bxrc, tools/system 都不是它们的问题。
需要编译出能支持远程gdb调试的bochs.



你可能感兴趣的:(虚拟机bochs (bochsdbg,bochsgdb)准备)