系列目录
- 序篇
- 准备工作
- BIOS 启动到实模式
- GDT 与保护模式
- 虚拟内存初探
- 加载并进入 kernel
- 显示与打印
- 全局描述符表 GDT
- 中断处理
- 虚拟内存完善
- 实现堆和 malloc
- 创建第一个内核线程
- 多线程运行与切换
- 锁与多线程同步
- 进程的实现
- 进入用户态
- 一个简单的文件系统
- 加载可执行程序
- 系统调用的实现
- 键盘驱动
- 运行 shell
安装 Bochs
Bochs 是一个硬件模拟器,我们写的内核将运行在上面,后续所有的开发调试工作也将在这上面进行,所以第一步就是安装它。我的开发环境是 Linux Mint 系统,你用 Ubuntu 也一样,可以直接安装:
sudo apt install bochs
要是这种方法不行的话,可以直接去官网下载源码包编译安装,这种方法我也试过是 ok 的。不过在安装过程中会遇到一些第三方依赖的库不全的问题,那就逢山开路遇水搭桥,把依赖都安装上就行,在这里我就不细说了,需要你自己动手想想办法,不会很难的,网上也有一些教程可以参考。
至于其它系统我没试过,但是编译源码包安装的方式肯定是行得通的。
运行 Bochs
首先你需一个 Bochs 运行的配置文件 bochsrc.txt
,这是我用的:
# RAM size
megs: 32
# Change to your Bochs installation path
romimage: file=/usr/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/share/bochs/VGABIOS-lgpl-latest
# Disk
boot: disk
ata0: enabled=1, ioaddr1=0x01f0, ioaddr2=0x03f0, irq=14
ata0-master: type=disk, path="scroll.img", mode=flat, cylinders=6, heads=16, spt=63
log: bochsout.txt
mouse: enabled=0
keyboard_mapping: enabled=1, map=/usr/share/bochs/keymaps/x11-pc-us.map
clock: sync=realtime
cpu: ips=1000000
这里最重要的部分就是 Disk 相关配置,我们这里用到了一个磁盘,这也是后面的 boot loader 和内核镜像盘,系统就是用该盘启动。当然这不是真的磁盘。就是一个镜像文件。
其中 path="scroll.img"
就是镜像文件,这里和配置文件 bochsrc.txt
在同一路径下,所以就很简单。名字你随便起,我的叫 scroll
,至于为什么后面再说。 cylinders
,heads
,spt
几个都是硬盘硬件相关的一些参数了,什么柱面柱头之类的不必深究。
当然现在我们还没有内核镜像文件,Bochs 自带了一个命令行工具 bximage
,可以为你制作一个写满了 0 的镜像文件,并且帮你确定上述的这几个参数,你只需要告诉它你的镜像文件需要多大,以 MB 为单位:
>> bximage
========================================================================
bximage
Disk Image Creation Tool for Bochs
$Id: bximage.c 11315 2012-08-05 18:13:38Z vruppert $
========================================================================
Do you want to create a floppy disk image or a hard disk image?
Please type hd or fd. [hd] hd
What kind of image should I create?
Please type flat, sparse or growing. [flat] flat
Enter the hard disk size in megabytes, between 1 and 8257535
[10] 1
I will create a 'flat' hard disk image with
cyl=2
heads=16
sectors per track=63
total sectors=2016
total size=0.98 megabytes
What should I name the image?
[c.img] test
Writing: [] Done.
I wrote 1032192 bytes to test.
The following line should appear in your bochsrc:
ata0-master: type=disk, path="test", mode=flat, cylinders=2, heads=16, spt=63
一切就绪,可以运行 Bochs 了:
bochs -f bochsrc.txt
运气好的话可以看到这个界面,说明启动成功了:
建立项目
话说目前为止我们的项目还没建起来,所以先去 Git 建一个吧。我先给出我的 Git 项目地址,你可以先参考下,也可以下载下来运行里面的 ./start.sh
脚本,看下运行效果。
我给这个项目起的名字叫 scroll
,中文意思就是卷轴,就是这东西:
卷轴,就是一张纸,一幅画卷。在我们这里就是内存,磁盘,从一片空白开始,而那支画笔就是 CPU。整个内核的启动,运行,本质上就是 CPU 和内存之间的一场对话,CPU 在内存上来回跳跃,翻转腾挪,勾画出一个庞大复杂的工程系统,这就是 OS。
下一篇开始,我们将正式进入 OS 的启动:BIOS 启动到实模式。