简述:
跟着《orange'S一个操作系统的实现》一书进行操作,将其中需要注意的过程记录下来。
第1章 略。
第2章 搭建bochs开发环境
参考链接 《Orange's 一个操作系统的实现》读书手记2--- [ 搭建你的工作环境]
计算机环境:ubuntu10.04TLS
bochs是由C++编写的,我们要安装相应的编译环境
sudo apt-get install build-essential
如果要图形界面,
sudo apt-get install xorg-dev
安装bison,
sudo apt-get install bison
到bochs官方网站下载源码包bochs-2.3.5.tar.gz,解压后,执行命令:
./configure --enable-debugger --enable-disasm
修改bx_debug/symbols.cc的97行之后加上一些代码,如下红色字体所示:
usingnamespace std;
#ifdef__GNUC__ (新加的,注意前后都是两个下划线)
usingnamespace __gnu_cxx;(新加的,注意前面是两个下划线)
#endif (新加的)
structsymbol_entry_t;
make install
bochs 配置文件bochsrc:
#memory
megs:32
# file of rom images
romimage: file=/usr/local/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest #也可以使用,vgaromimage: file=/usr/share/vgabios/vgabios.bin
# disk will be used
floppya: 1_44=a.img, status=inserted
# boot disk
boot:floppy
# log messages
log:bochsout.log
# disable the mouse
mouse:enabled=0
#enable key mapping
keyboard_mapping:enabled=1, map=/usr/local/share/bochs/keymaps/x11-pc-us.map #位置与书中位置稍有不同
最后,运行 命令:
bochs -qf bochsrc
c
这样就可以看到模拟界面上有字符显示了。如果不输入c/continue命令的话,界面上是黑屏,不显示字符的。
第3章 保护模式
1.运行第一个例子,目的是在屏幕上11行,79列处打印一个红色字符'P'
如果bximage新建软盘映像a.img,将pmtest1.asm编译成pmtest1.bin,并装入a.img,通过bochs运行时,出错:无法找到启动设备。
因为,在a.img的512字节的最后两个字节不是0xaa55,所以bios无法识别软盘的0面0磁道0扇区是引导扇区。
书中给出的是依赖于chapter2中做好的a.img启动映像。
当然,修改pmtest1.asm后,使得512字节的最后两个字节为0xaa55,这样就可以单独使用pmtest1.asm,而不需要依赖于以前的启动映像了。由于对nasm不熟悉,具体怎么修改,暂时放在这里。
2. 保护模式的运行环境
以上都是应用程序(如pmtest1.bin)写到引导扇区运行的,很方便。但如果应用程序超过了512B,就有两种方法解决。
1.通过引导扇区将读取程序并运行,类似操作系统内核的启动。
2.把程序编译成com文件通过DOS来执行。
freedos的获取:1)这里使用书中附带的光盘(我已上传,由于光盘资料压缩后将近100MB,所以分成4部分上传了,其中一个的下载地址,《Orange'S:一个操作系统的实现》随书光盘(完整版))。2)也可以到http://www.freedos.org/download/下载。我下载使用的是fdboot.img,选择使用启动选项2
这里有一个问题,就是我们没有软盘,使用的是虚拟软盘。关于虚拟软盘pm.img的建立过程在这里说明一下。
bximage
fd
1.44
pm.img
建立pm.img成功。将pm.img格式化成dos可以识别的格式。
losetup /dev/loop0 pm.img (loop设备,伪设备,使得伪块设备像真实块设备一样使用的设备。这一步的意思是,用一个循环设备节点连接pm.img文件)
mkfs.msdos /dev/loop0
losetup -d /dev/loop0
挂载虚拟软盘:
mount -o loop pm.img /mnt
cp pmtest1b.com /mnt
这样应用程序就放入到pm.img中了。