详细过程请参考B站Up踌躇月光。
1 开发环境搭建
1.1 模拟器与汇编器安装
基于bochs硬件模拟器开发,使用的操作系统为ubuntu20.04。
在终端执行以下命令安装bochs和汇编器。
sudo apt install bochs //安装bochs
sudo apt install bochs-x //安装bochs需要的GUI组件
sudo apt install nasm //安装汇编器
1.2 编写引导扇区和创建硬盘镜像
新建工作目录MyOS,在其中创建src目录,创建引导扇区boot.asm,写入下列内容:
;设置屏幕模式为文本模式,清除屏幕
mov ax, 3
int 0x10
;初始化段寄存器
mov ax, 0
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7c00
;0xb8000为文本显示的内容所在位置
mov ax, 0xb800
mov ds, ax
mov byte [0], 'H' ;在0xb8000写入字符H
;阻塞
jmp $
;用0填充
times 510 - ($ - $$) db 0
;主引导扇区的最后两个字节必须是0x55和0xaa
db 0x55, 0xaa
将引导扇区汇编成二进制文件:
nasm -f bin boot.asm -o boot.bin
创建大小为16MB、扇区大小为512字节的硬盘:
bximage -q -mode=create -hd=16 -sectsize=512 -imgmode=flat master.img
该命令执行后可以在输出信息中找到下面的信息:
The following line should appear in your bochsrc:
ata0-master: type=disk, path="master.img", mode=flat
最后一行在配置bochs时会用到。
将引导扇区写入硬盘:
dd if=boot.bin of=master.img bs=512 count=1 conv=notrunc
1.3 配置bochs
终端启动bochs:
bochs
会得到类似下面的输出:
========================================================================
Bochs x86 Emulator 2.6.11
Built from SVN snapshot on January 5, 2020
Timestamp: Sun Jan 5 08:36:00 CET 2020
========================================================================
00000000000i[ ] LTDL_LIBRARY_PATH not set. using compile time default '/usr/lib/bochs/plugins'
00000000000i[ ] BXSHARE not set. using compile time default '/usr/share/bochs'
00000000000i[ ] lt_dlhandle is 0x56154c227c00
00000000000i[PLUGIN] loaded plugin libbx_unmapped.so
00000000000i[ ] lt_dlhandle is 0x56154c229220
00000000000i[PLUGIN] loaded plugin libbx_biosdev.so
00000000000i[ ] lt_dlhandle is 0x56154c22aa20
00000000000i[PLUGIN] loaded plugin libbx_speaker.so
00000000000i[ ] lt_dlhandle is 0x56154c22c7a0
00000000000i[PLUGIN] loaded plugin libbx_extfpuirq.so
00000000000i[ ] lt_dlhandle is 0x56154c22cf70
00000000000i[PLUGIN] loaded plugin libbx_parallel.so
00000000000i[ ] lt_dlhandle is 0x56154c22ebd0
00000000000i[PLUGIN] loaded plugin libbx_serial.so
00000000000i[ ] lt_dlhandle is 0x56154c232fd0
00000000000i[PLUGIN] loaded plugin libbx_gameport.so
00000000000i[ ] lt_dlhandle is 0x56154c233800
00000000000i[PLUGIN] loaded plugin libbx_iodebug.so
00000000000e[ ] Switching off quick start, because no configuration file was found.
------------------------------
Bochs Configuration: Main Menu
------------------------------
This is the Bochs Configuration Interface, where you can describe the
machine that you want to simulate. Bochs has already searched for a
configuration file (typically called bochsrc.txt) and loaded it if it
could be found. When you are satisfied with the configuration, go
ahead and start the simulation.
You can also start bochs with the -q option to skip these menus.
1. Restore factory default configuration
2. Read options from...
3. Edit options
4. Save options to...
5. Restore the Bochs state from...
6. Begin simulation
7. Quit now
输入4,回车,再输入bochsrc,回车,回到该界面,输入7,回车退出。
打开bochsrc,找到13行附近为下列内容的行,用上面提到的内容替换。
ata0-master: type=none
替换为:
ata0-master: type=disk, path="master.img", mode=flat
这样配置后,在当前目录启动bochs时,它就知道要从哪个硬盘中读取引导文件了。
然后在
display_library: x
后添加内容:
display_library: x, options="gui_debug"
这样可以通过图形界面调试。
保存完以后,执行bochs -q
启动,顺利的话会弹出两个窗口,一个是bochs,另一个是调试窗口。在调试窗口中点击continue,会看到bochs窗口上打印了字符H。
1.4 编写makefile
boot.bin: boot.asm
nasm -f bin boot.asm -o boot.bin
master.img: boot.bin
yes | bximage -q -mode=create -hd=16 -sectsize=512 -imgmode=flat master.img
dd if=boot.bin of=master.img bs=512 count=1 conv=notrunc
.PHONY: clean
clean:
rm -rf *.bin
rm -rf *.img
.PHONY: bochs
bochs: master.img
bochs -q
2 主引导扇区
2.1 计算机启动的过程
计算机上电后,首先执行固件BIOS进行硬件检测,如果都正常,就将引导扇区的内容加载到0x7c00
并跳转到此处执行指令。
执行make bochs
,启动系统,在调试窗口下方输入框中输入:
break 0x7c00
回车添加断点。
然后点continue,这时bochs窗口会显示一些基本信息:
右侧方框中的内容即为刚刚编写的boot.asm引导扇区的内容。