这里写个往期推荐,这样可以来回跳跃(狗头
0x00-环境准备
0x01-BIOS以及MBR
0x02-MBR支持显卡
0x03-MBR操作硬盘以及Loader
0x04-进入保护模式
今天开始更新编写OS,从底层bootloader至用户shell编写一条龙,可以帮助广大想从事操作系统类型工作的同学对底层更加透彻,我的所有源码都在github上同文章保持同步更新,地址在文末,大家可以多提出意见PR
0x00 环境准备
本机环境为Ubuntu 20.04,镜像大家可以自行去官网免费获得
1. bochs安装
这里当然也可以使用qemu,但由于我是大部分对照《操作系统真象还原》这本书来学习,所以为了避免不必要的麻烦,使用bochs即可。
首先这里是安装路径,大伙认准2.6.8的版本,下载后文件即为bochs-2.6.8.tar.gz(2.6.2有点问题)
我们此时先进行解压,然后进入bochs-2.6.2目录
tar -zxvf bochs-2.6.8.tar.gz
此时我们需要依次进行文件配置以及make
./configure \
--prefix=/your_path/bochs \
--enable-debugger \
--enable-disasm \
--enable-iodebug \
--enable-x86-debugger \
--with-x \
--with-x11
这里如若想使用gdb进行调试,则需要将--enable-debugger替换为--enable-gdb-stub,不过我这里不建议大家使用gdb,因而环境一致可能造成许多不同的问题,我们直接用bochs本身自带的调试功能即可
当我们将上述配置好会形成Makefiel后直接make就可以开始编译了
make
当咱们make无误后,再次使用命令make install
即可在你的制定目录下生成所需要要的文件
2. bochs配置
我们在bochs目录下创建一个名为bochsrc.disk,我感觉这很类似与我们qemu中的初始init文件,他就是设置参数来调整我们的磁盘情况,你也可以理解为咱们这在规定磁盘参数
具体配置如下
#第一步,首先设置 Bochs 在运行过程中能够使用的内存,本例为 32MB
#关键字为 me gs
megs :512
#第二步,设置对应真实机器的 BIOS VGA BIOS
#对应两个关键字为 romimage vgaromimage
romimage: file=/home/dawn/repos/OS_learning/bochs/share/bochs/BIOS-bochs-latest
vgaromimage: file=/home/dawn/repos/OS_learning/bochs/share/bochs/VGABIOS-lgpl-latest
#第三步,设置 Bochs 所使用的磁盘,软盘的关键字为 floppy
#若只有一个软盘,目IJ 使用 floppy 即可,若有多个,则为 floppya, floppyb… #floppya: 1_ 44=a.img, status=inserted
#第四步,选择启动盘符。
#boot: floppy #默认从软盘启动,将其注释
boot: disk #改为从硬盘启动。我们的任何代码都将直接写在硬盘上,所以不会再有读写软盘的操作。
#第五步,设置日志文件的输出。
log: bochs.out
#第六步,开启或关闭某些功能。
#下面是关闭鼠标,并打开键盘。
mouse: enabled=0
keyboard:keymap=/home/dawn/repos/OS_learning/=bochs/share/bochs/keymaps/xll-pc -us.map
#硬盘设置
ata0: enabled=1, ioaddr1=Ox1f0, ioaddr2=0x3f0, irq=14
#下面的是增加的 bochs gdb 的支持,这样 gdb 可以远程连接到此机器的 234 口调试了
#gdbstub : enabled=l, port=l234, text_base=O, data_base=O, bss_base=O
################### 配置文件结束 #####################
但是仅有一个配置文件还不够,所以我们需要运用bochs自带的功能生成一个虚拟的磁盘,他位于在你们bochs目录下bin目录里面
一下为对应参数所表达含义,这里你也可以通过使用help指令来查看
- -fd 创建软盘
- -hd 创建硬盘
- -mode 创建硬盘类型
- -size 硬盘大小
- -q 静默模式
所以咱们执行如下命令
bin/bximage -hd -mode="flat" -size=60 -q hd60M.img
当然我们也可以用如下方法
此时注意我们还需要将画红线的那条参数加入我们之前写的bochsrc.disk配置文件中(联动起来惹
然后我们再将用以下指令来启动咱们的裸机
bin/bochs -f bochsrc.disk
执行之后会发现有个错误
此时显示他不是一个bootable disk,也就是说咱们没写boot,至于具体boot程序如何写,我将在下一篇继续解释
0x01 总结
此篇十分简单,还根本没开始实现os,所以十分顺畅,还提一嘴,这个项目我会持续在github上更新,源码什么的一股脑全放上面,有需要的大家可以去看看
传送门