bochs linux0.11

BOCHS运行需要bochsrc文件l. 可查看这些文件。 # how much memory the emulated machine will have megs: 32 # filename of ROM images romimage:file=$BXSHARE/BIOS-bochs-latest #注意上面这一行,2.3.5以后的后面不能加,address=

BOCHS运行需要bochsrc文件l. 可查看这些文件。

# how much memory the emulated machine will have

megs: 32

# filename of ROM images

romimage:file=$BXSHARE/BIOS-bochs-latest

#注意上面这一行,2.3.5以后的后面不能加,address=0xf0000  否则会出现

#Message: ROM: System BIOS must end at 0xfffff 错误的  这个后面会解释

#romimage: file=mybios.bin, address=0xfff80000 # 512k at memory top

vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest

# what disk images will be used

floppya: 1_44=hello.img, status=inserted

#ata0-master: type=disk, mode=flat, path="30M.sample"

# hard disk

#ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14

#ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15

#ata2: enabled=0, ioaddr1=0x1e8, ioaddr2=0x3e0, irq=11

#ata3: enabled=0, ioaddr1=0x168, ioaddr2=0x360, irq=9

boot: floppy

#boot: disk

megs: 32 是说内存是32M

floppya: 1_44=a.img, status=inserted 指定了软盘映像文件

boot: floppy 从软盘启动。

http://bochs.sourceforge.net/下载nasm

我下的是nasm-2.08.tar.gz

tar zxvf nasm-2.05.01.tar.gz

cd nasm-2.05.01

./configure

==============================================================

bximage

Disk Image Creation Tool for Bochs

$Id: bximage.c,v 1.34 2009/04/14 09:45:22 sshwarts Exp $

========================================================================

Do you want to create a floppy disk image or a hard disk image?

Please type hd or fd. [hd] fd

Choose the size of floppy disk image to create, in megabytes.

Please type 0.16, 0.18, 0.32, 0.36, 0.72, 1.2, 1.44, 1.68, 1.72, or 2.88.

[1.44]

I will create a floppy image with

cyl=80

heads=2

sectors per track=18

total sectors=2880

total bytes=1474560

What should I name the image?

[a.img] hello.img

Writing: [] Done.

I wrote 1474560 bytes to hello.img.

The following line should appear in your bochsrc:

floppya: image="hello.img", status=inserted

把bin写入img中

dd if=/nasm-2.05.01/helloworld/hello.bin of=hello.img bs=512 count=1 conv=notrunc

读入了 0+1 个块

输出了 0+1 个块

bochs -q -f .bochsrc 运行我们的OS

出现如下错误

Bochs is exiting with the following message:

[BIOS ] No bootable device.

查看生成的hello.bin大小

ls -al hello.bin

-rw-r--r--    1 root     900            22  5月 20 11:45 hello.bin

大小为22byte

我们要把它们弄成512byte的

在hello.asm最后添加

times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节

dw        0xaa55      ;这个是结束标志符

再用nasm编译生成hello.bin

再写入到hello.img便可以了。

然后执行

bochs -q -f .bochsrc

便可以看到红色的H字样了

ps:

若出现Message: ROM: System BIOS must end at 0xfffff 错误的原因如下:

In previous versions of Bochs the BIOS size was 64k and you always had to

specify the start address at 0xf0000. Starting with release 2.2.5 Bochs

supports BIOS images up to 512k and it's no longer necessary to specify the

start address if the BIOS ends at memory top

就是不要再指定address了。

当然要显示Hello world可用以下这个

org 07c00h

mov        ax, cs;数据传送指令,将代码段寄存器cs的内容赋给通用寄存器ax

mov        ds, ax;使数据段与代码段在同一个段

mov        es, ax;使附加段与代码段在同一个段

call        DispStr

jmp        $ ;$表示当前地址,无限循环

DispStr:

mov        ax, BootMessage

mov        bp, ax ;es:bp=串地址

mov        cx, 15 ;串长度

mov        ax, 01301h  ;ah=13h, al=01h 视频中断13h号功能:写字符串;AL=01H,表示写完字符串后,更新光标位置

mov        bx, 000ch   ;页号为0(bh=0) 黑底红字(bl=0ch,高亮)

mov        dl, 0 ;DH、DL=写串的光标位置,DH=行号,DL=列号

int        10h

ret

BootMessage:        db "Hello,World OS!"

times 510-($-$$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节

dw        0xaa55

times 510-($-$$) db 0

This reads: Times 510-(Start of this Instruction - Start of program) with 0's

$ stands for start of the instruction

$$ stands for start of the program

dw 0xAA55

For some reason the signature has to be written this way round!

This fills the last to bytes of the boot loader with 55AA (this is a hex number)

Without this signature the BIOS won't recognise this as a bootable disk!

2.调试

Bochs是开发操作系统的极品模拟器的另外一个原因是它带有调试功能。这也是本文的另一个需要重点讲解的地方。Bochsdbg这个程序是调试模式。在调试模式中,我不会象前面的那样直接双击配置文件就进入调试模式的法子。我用的是笨法子。在Bochs目录里面把配置文件配好,注意,关于光驱,软驱,硬盘的路径一定要指定正确。然后双击Bochsdbg.exe, 进入图2显示界面

Bochs2.gif

选择2后,选择配置文件的路径和配置文件的文件名,然后选择5就开始运行了。事实上,由于Bochs2.1.1默认的配置文件名是bochsrc.txt,在Bochs目录中,如果你的配置文件的文件名就是这,直接运行Bochsdbg就出现上面的画面,再直接回车就可以了。当然,此种方法也可以运行Bochs,不是调试模式的。

当然,你也可以学dlxlinux的方法,把run.bat文件种的bochs改成bochsdbg就可以。方法类似。

下面则进入如何调试了。敲入help,可以列出各个命令的用法。下面主要调试命令的用法。

下面分类进行讨论。

控制执行类:

c                           继续执行

stepi [count]                  执行count条指令,默认count为1

step [count]                 执行count条指令,默认count为1

s     [count]               执行count条指令,默认count为1

Ctrl-C                      停止执行, 并返回命令行

quit                        退出调试

q                           退出调试

断点类:

注意:这里面的’seg’和’addr’所用的数的格式和c语言中的一致,例如

十六进制:0xcdef0123

八进制  :01234567

十进制  :12345678

vbreak seg:off              设置指令的虚拟地址的断点位置。

vb    seg:off

lbreak addr                 设置指令的线性地址的断点位置。

lb    addr

pbreak

addr             设置指令的物理地址的断点位置。

pb

addr            (’*’这个选项是为GDB兼容设置的)

break

addr

b

addrinfo break                  显示现在所有的断点的状态delete n                    删除第n个断点del   n                    同上d    n                     同上操作内存类:x /nuf addr     查看线性地址的内存xp /nuf addr      查看物理地址的内存     n              显示多少个字节的内存     u              单位长度; one o单位f                      b 字节                      h 半字(2 字节)                      w 字 (4 字节)                      g 双字 (8 字节)                        注意:这些并不是Intel中的术语,但是它们和GDB的是一致的。       F                                 打印格式:                                          x   打印十六进制                                          d   打印十进制                                          u   打印无符号十进制                                          o   打印八进制                                          t      打印二进制n, f, 和u都是可选参数。U和f默认的是你最后一次用的值,如果没有用过的话,就是w(word)和x(hex)。N默认的是1。addr也是可选参数。如果你没有知道他的话,它将是下一条地址。setpmem addr datasize val     设置物理内存某地址的内容。Addr是内存地址,datasize地址长度,val所想设置的值。crc addr1 addr2           显示物理内存addr1到addr2之间的CRCInfo 命令info program      程序的执行状态info registers      显示寄存器内容info break        显示断点状态操作CPU寄存器set $reg = val    改变CPU寄存器的值为val。寄存器可以为eax,ecx,edx,ebx,esp,ebp,esi,edi。                  不能为eflages,cs,ss,ds,es,fs,gs。info registers    见Info部分dump_cpu          显示完整的CPU信息。set_cpu           设置CPU的状态        “dump_cpu”和“set_cpu”的格式:    "eax:0x%x/n"    "ebx:0x%x/n"    "ecx:0x%x/n"    "edx:0x%x/n"    "ebp:0x%x/n"    "esi:0x%x/n"    "edi:0x%x/n"    "esp:0x%x/n"    "eflags:0x%x/n"    "eip:0x%x/n"    "cs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u/n"    "ss:s=0x%x, dl=0x%x, dh=0x%x, valid=%u/n"    "ds:s=0x%x, dl=0x%x, dh=0x%x, valid=%u/n"    "es:s=0x%x, dl=0x%x, dh=0x%x, valid=%u/n"    "fs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u/n"    "gs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u/n"    "ldtr:s=0x%x, dl=0x%x, dh=0x%x, valid=%u/n"    "tr:s=0x%x, dl=0x%x, dh=0x%x, valid=%u/n"    "gdtr:base=0x%x, limit=0x%x/n"    "idtr:base=0x%x, limit=0x%x/n"    "dr0:0x%x/n"    "dr1:0x%x/n"    "dr2:0x%x/n"    "dr3:0x%x/n"    "dr4:0x%x/n"    "dr5:0x%x/n"    "dr6:0x%x/n"    "dr7:0x%x/n"    "tr3:0x%x/n"    "tr4:0x%x/n"    "tr5:0x%x/n"    "tr6:0x%x/n"    "tr7:0x%x/n"    "cr0:0x%x/n"    "cr1:0x%x/n"    "cr2:0x%x/n"    "cr3:0x%x/n"    "cr4:0x%x/n"    "inhibit_int:%u/n"    "done/n"反汇编命令:disassemble start end 反汇编的地址范围set $disassemble_size = n 告诉调试器,反汇编段的属性(16位或32位,默认32位)。相信到这里,大家也基本会用BOCHS这个模拟器了。本文的重点主要在前面的Bochs的使用方面。后面的调试部分,仅仅列个表,大家用的时候,参考下每个命令的用法,也就差不多会调试了。关于更具体的,大家可以参考bochs的文档,里面有更详细的介绍。

知秋君
上一篇 2024-07-19 19:36
下一篇 2024-07-19 19:02

相关推荐