操作系统实现

本文档介绍了如何使用Ubuntu20.04和Bochs硬件模拟器来搭建开发环境,创建引导扇区和硬盘镜像,配置Bochs进行模拟运行,并通过编写makefile简化流程。开发者可以借此学习操作系统的引导过程和基本原理。
摘要由CSDN通过智能技术生成

详细过程请参考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引导扇区的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值