ORANGE’S:一个操作系统的实现:Windows和Ubuntu分别安装bochs-hello world

Ubuntu12.04下安装和配置bochs:
因为 Bochs 是用C++写的,所以这里要安装GNU gcc/g++编译器。
sudo apt-get install build-essential;sudo apt-get install xorg-dev;sudo apt-get install bison;sudo apt-get install g++
可能的错误:有些软件不能通过验证
sudo apt-get update 即可

具体安装步骤:
1.先去https://sourceforge.net/projects/bochs/files/
下载 bochs-2.6.9.tar.gz

2.解压下载的源代码:
sudo tar -zxvf bochs-2.6.9.tar.gz

3.进入bochs-2.6.9目录,执行如下命令安装bochs
sudo ./configure --enable-debugger --enable-disasm
sudo make
cp bochs bochsdbg
sudo make install
其中--enable-debugger --enable-disasm使能调试功能和反汇编功能。
可能的错误:gtk_enh_dbg_osdep.cc:20:21: 致命错误: gtk/gtk.h:没有那个文件或目录
编译中断。解决方法:
sudo apt-get install libgtk2.0-dev
sudo make dist-clean
sudo ./configure --enable-debugger --enable-disasm
sudo make
cp bochs bochsdbg
sudo make install

bochs的使用:

到bochs-2.6.9安装目录下运行bximage制作软盘镜像,选择fd(软盘),然后回车n下默认知道生成镜像a.img。不多说,上图:

ORANGE’S:一个操作系统的实现:Windows和Ubuntu分别安装bochs-hello world

拿到该书附带文件中的引导汇编文件boot.asm,用nasm命令生成boot.bin,再将boot.bin和上面生成的a.img放在同一目录下,这里我创建了xxj-sources目录,两个文件都放进去了,然后用dd命令将boot.bin的内容写进a.img:
dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
以下是boot.asm的内容:
——————————————————————————
    org    07c00h            ; 告诉编译器程序加载到7c00处
    mov    ax, cs
    mov    ds, ax
    mov    es, ax
    call    DispStr            ; 调用显示字符串例程
    jmp    $            ; 无限循环
DispStr:
    mov    ax, BootMessage
    mov    bp, ax            ; ES:BP = 串地址
    mov    cx, 16            ; CX = 串长度
    mov    ax, 01301h        ; AH = 13,  AL = 01h
    mov    bx, 000ch        ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
    mov    dl, 0
    int    10h            ; 10h 号中断
    ret
BootMessage:        db    "Hello, OS world!"
times     510-($-$$)    db    0    ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw     0xaa55                ; 结束标志
——————————————————————————
这样是否就可以运行bochs了呢,还差一点点。将该书附带文件bochsrc拷贝到xxj-sources中,这是bochs的配置文件,该文件的配置需参考bochs提供的参考文件bochsrc.5根据自己的系统情况修改,莫慌,不会改的先拷过来,,运行期间遇到错误再改就行。我的是这样的:
————————————————————————————————————
###############################################################
# Configuration file for Bochs
###############################################################

# how much memory the emulated machine will have
megs: 32

# filename of ROM images
romimage: file=/usr/local/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest

# what disk images will be used
floppya: 1_44=a.img, status=inserted

# choose the boot disk.
boot: floppy

# where do we send log messages?
# log: bochsout.txt

# disable the mouse
mouse: enabled=0

# enable key mapping, using US layout as default.
keyboard: keymap=/usr/local/share/bochs/keymaps/x11-pc-us.map
————————————————————————————————————

执行命令 bochs -f bochsrc ,顺利的话看到这个,输入6回车或者直接回车

ORANGE’S:一个操作系统的实现:Windows和Ubuntu分别安装bochs-hello world

然后你会看到虚拟机启动了,因为是带调试功能的,所以你会看到黑屏哈哈,接下来开始最简单的调试吧:

ORANGE’S:一个操作系统的实现:Windows和Ubuntu分别安装bochs-hello world

回到命令行界面,输入b 0x7c00,再连续输入两个c,你就能看到美丽的"Hello OS world!"了。最开始的“b 0x7c00”在0x7c00处设置了断点,随后的命令“c”让代码继续执行。

ORANGE’S:一个操作系统的实现:Windows和Ubuntu分别安装bochs-hello world

部分Bochs调试指令如下:

ORANGE’S:一个操作系统的实现:Windows和Ubuntu分别安装bochs-hello world


注:本人尝试在Windows下用vmware安装了ubuntu 12.04,再在ubuntu中安装bochs,结果爆炸了,一重起ubuntu虚拟机直接卡在加载界面,动都不动,猜想可能是bochs修改了ubuntu的引导吧,用镜像进去chroot后一查看引导文件/boot/grub/grub.cfg,发现真的被修改了,所有的set root='(hd0,msdos1)'都被改成了set root='(hd1,msdos1)',本人将其改回来,无效哈哈。估计是还有别的地方被改了吧,咱也不是大神,就不研究了,直接进入双系统的Ubuntu系统中,安装bochs后,重启安然无恙。这个问题留待以后研究吧。
——————————————————————————
Windows下安装就简单了,下载安装包直接安装。不过按书中第一章想运行出Hello os world还是出了点波折。
用软件安装后自带的bximage生成的a.img总是有问题,报错如下:
ata0-0: could not open hard drive image file 'a.img

百度必应搜了愣是查不出来,难道就我遇到?无奈之下使用软件自带hd10meg.img,结果可以了,我只能看出两个文件的大小不一样,又是个遗留问题。我把hd10meg.img名字改成a.img,然后将boot.bin写进去,能够正常启动。因为该书是用Linux的,接下来我也用Linux吧哈哈。

ORANGE’S:一个操作系统的实现:Windows和Ubuntu分别安装bochs-hello world

——————————————————————————————————————————————

参考链接,感谢这些前辈!

ubuntu安装和配置bochs:

http://www.linuxidc.com/Linux/2016-10/135905.htm

自己动手写操作系统之Windows7下使用Bochs搭建工作环境:
http://blog.****.net/the_important/article/details/40615797