您的位置:首页 > 其它

写操作系统--0.bochs源码编译安装及其调试指令

2016-11-30 18:24 661 查看
环境: ubuntu 9.04 或 redhat 9.0
bochs: bochs-2.4.6.tar.gz 更新了bochs-2.6.8的安装
一、ubuntu 下apt安装
1.1 编译环境

cong@msi:/work/os/bak/bochs-2.6.8$
sudo apt-get install build-essential  

cong@msi:/work/os/bak/bochs-2.6.8$
sudo apt-get install xorg-dev        -->这个必须安装

cong@msi:/work/os/bak/bochs-2.6.8$
sudo apt-get install libgtk2.0-dev

1.2 编译不带任何调试的bochs

cong@msi:/work/os/bak/bochs-2.6.8$
mkdir install          -->以后install把生成的bochs都放在这个目录下面

cong@msi:/work/os/bak/bochs-2.6.8$ ./configure --prefix=`pwd`/install

cong@msi:/work/os/bak/bochs-2.6.8$
make -j8               -->直接编译即可

cong@msi:/work/os/bak/bochs-2.6.8$
make install

1.3 出错及问题解决

a.出错: ERROR: X windows
gui was selected, but X windows libraries were not found.

 root@ubuntu:~# aptitude install xorg-dev

b.出错: ERROR: pkg-config
was not found, or unable to access
the gtk+-2.0 package.

 root@ubuntu:~# aptitude install libgtk2.0-dev

c.在configure时同时配了debugger&&gdb-stub会有如下错误./configure --enable-gdb-stub --enable-disasm --enable-debugger

 configure: error: --enable-debugger and --enable-gdb-stub
are mutually exclusive

1.4 编译带asm调试功能的bochs

cong@msi:/work/os/bak/bochs-2.6.8_asm$ ./configure --prefix=`pwd`/install --enable-debugger --enable-disasm

如果加上--enable-plugins会出现 

>>PANIC<< dlopen failed for module 'unmapped': file not found

1.5 编译带gdb调试功能的bochs

cong@msi:/work/os/bak/bochs-2.6.8_gdb$ ./configure --prefix=`pwd`/install --enable-disasm --enable-gdb-stub 

cong@msi:/work/os/bak/bochs-2.6.8_gdb$
make -j8

cong@msi:/work/os/bak/bochs-2.6.8_gdb$
make install

1.6 注意:

a.用apt-get install 安装的bochs 版本不能调试,如果需要加调试功能需要从源码添加编译选项
 b. Linux 没有bochsbgb工具,在configure时加了enable-debugger选项,重新编译后的bochs就带有调试功能。

二、Redhat 9.0 编译安装
环境: RedHat 9.0
gcc版本: gcc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)

2.1 编译安装 bochs 不带调试信息
tar xvfz bochs-2.3.5.tar.gz
cd bochs-2.3.5
./configure --prefix=/opt/bochs/run
make ; make install

2.2编译安装 bochs 带汇编调试
./configure --prefix=/opt/bochs/debug --enable-plugins --enable-debugger --enable-disasm
make 
make install

2.3 编译安装 bochs 带gdb调试
./configure --prefix=/opt/bochs/gdbstub --enable-plugins --enable-disasm --enable-gdb-stub 
make
make install

注意:这里编译两次bochs 是因为如果一步到位configure 
./configure --enable-gdb-stub --enable-disasm --enable-debugger 
它会很生气
configure: error: --enable-debugger and --enable-gdb-stub are mutually exclusive

2.4 gdb+bochs调试linux0.11的总出现缺页中断问题

a. bochs-2.6.8下修改 src/gdbstub.cc,增加如下红色部分



b. gdbstub.cc L492

else if (last_stop_reason == GDBSTUB_STOP_NO_REASON)

{

   write_signal(&buf[1], SIGSEGV);

}

c. 编译安装之后

启动gdb,在gdb的shell中输入 handle SIGSEGV nostop noprint ignore 即可

以上出自《gdb+bochs调试linux0.11的总出现缺页中断问题。》
http://blog.chinaunix.net/uid-7480243-id-2051574.html
3. 在RedHat9.0下编译时会出现如下的错误:

/usr/X11R6/lib/libXrandr.so: undefined reference to `XextAddDisplay'

/usr/X11R6/lib/libXrandr.so: undefined reference to `XextFindDisplay'

/usr/X11R6/lib/libXrandr.so: undefined reference to `XRenderSetSubpixelOrder'

/usr/X11R6/lib/libXrandr.so: undefined reference to `XextRemoveDisplay'

/usr/X11R6/lib/libXrandr.so: undefined reference to `XMissingExtension'

提示缺少库,编个小脚本练习一下。

#******test.sh ******#

#!/bin/sh

for file in `find /usr/X11R6/lib/*.a`

do

echo $file

nm $file | grep XextAddDisplay

done

执行:

[root@localhost tmp]# ./test.sh 

/usr/X11R6/lib/libGL.a

         U XextAddDisplay

         U XextAddDisplay

/usr/X11R6/lib/libXext.a

00000060 T XextAddDisplay

         U XextAddDisplay

/usr/X11R6/lib/libXfontcache.a

         U XextAddDisplay

/usr/X11R6/lib/libXft.a

/usr/X11R6/lib/libXi.a

         U XextAddDisplay

/usr/X11R6/lib/libXinerama.a

         U XextAddDisplay

上述打印中:

         U XextAddDisplay 说明XextAddDisplay 没有定义

         00000060 T XextAddDisplay 说明 XextAddDisplay己定义

依次grep 可以找出缺失的两个库 -lXext -lXrender 在Makefile中加上就可以了。
 
GUI_LINK_OPTS_X = $(X_LIBS) $(X_PRE_LIBS) -lX11 $(XPM_LIB) -lXrandr -lXext -lXrender

三.bochs调试指令

<bochs:1> help

h|help - show list of debugger commands

h|help command - show short command description

-*- Debugger control -*-

    help, q|quit|exit, set, instrument, show, trace, trace-reg,

    trace-mem, u|disasm, ldsym, slist

-*- Execution control -*-

    c|cont|continue, s|step, p|n|next, modebp, vmexitbp

-*- Breakpoint management -*-

    vb|vbreak, lb|lbreak, pb|pbreak|b|break, sb, sba, blist,

    bpe, bpd, d|del|delete, watch, unwatch

-*- CPU and memory
contents -*-

    x, xp, setpmem, writemem, crc, info,

    r|reg|regs|registers, fp|fpu, mmx, sse, sreg, dreg, creg,

    page, set, ptime, print-stack, ?|calc

-*- Working with bochs param tree -*-

    show "param", restore

3.1 查看内存中的数据

<bochs:2> help x

x /nuf <addr> - examine
memory at linear address

xp /nuf <addr> - examine
memory at physical address

    nuf is a sequence of numbers (how much values to display)

    and one or more of the [mxduotcsibhwg] format
specificators:

    x,d,u,o,t,c,s,i select the
format of the output (they stand for hex, decimal, unsigned, octal, binary, char, asciiz, instr)

    b,h,w,g select the
size of a data element (for byte, half-word, word and giant
word)

    m selects an alternative output format (memory dump)

a. 例如要查看0x102000处的数据-->按16进制4字节打印

<bochs:3> x /8wx 0x102000

0x00102000 <bogus+ 0>:    0x00000007    0x00001007    0x00002007    0x00003007

0x00102010 <bogus+ 16>:    0x00004007    0x00000000    0x00000000    0x00000000

b.例如要查看0x102000处的数据-->按16进制单字节打印

<bochs:4> x /8bx 0x102000

0x00102000 <bogus+ 0>:    0x07    0x00    0x00    0x00    0x07    0x10    0x00    0x00

3.2 反汇编

<bochs:5> help u

u|disasm [/count] <start> <end> - disassemble
instructions for given linear address

    Optional 'count' is the number of disassembled instructions

u|disasm switch-mode - switch between Intel and AT&T
disassembler syntax

u|disasm hex on/off - control disasm offsets and displacements format

u|disasm size = n - tell
debugger what segment size [16|32|64] to
use

       when "disassemble" command is used.

a. 例如要反汇编当前指令之后的32条指令

<bochs:6> u /32

00100035: ( ): add
eax, 0x00001000 ; 0500100000

0010003a: ( ): cmp
edi, 0x00104000 ; 81ff00401000

b. 例如要反汇编0x100000之后的32条指令

<bochs:7> u /32 0x100000

00100000: ( ): cld ; fc

00100001: ( ): mov eax, 0x00000018 ; b818000000

3.3设断点

<bochs:8> help b

p|pb|break|pbreak <addr> - set
a physical address instruction breakpoint

<bochs:9> help lb

lb|lbreak <addr> - set
a linear address instruction breakpoint

lb 0x100000

b 0x7c00
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: