#Orange's 自制OS系列笔记(2)#写一个简单的OS

写一个操作系统,目的就是得到一个软盘映像文件 *.img  , 笔者首先写了一个映像文件 a.img进行展示,之后再介绍是如何完成的。

使用bochs运行a.img:  (图中红色部分即为要输出内容)



使用VMare运行a.img:



可以看到两幅图的红色输出部分是一样的。实际我们已经 写了一个极其简单的操作系统,它只含有一个引导扇区(boot sector)。关于这个引导扇区是如何完成的下节再写,这里主要是通过它来详述如何完成一个简单的操作系统,下面简述上面的 a.img 是如何得到的。

流程如下:

1. 首先先写一个引导扇区的汇编代码 boot.asm,代码在之后笔记中进行详细解释。

        org	07c00h			
	mov	ax, cs
	mov	ds, ax
	mov	es, ax
	call	DispStr			
	jmp	$			
DispStr:
	mov	ax, BootMessage
	mov	bp, ax			
	mov	cx, 38			
	mov	ax, 01301h		
	mov	bx, 000ch		
	mov	dl, 0
	int	10h			
	ret
BootMessage:		db	"Hey! I am Rooeye, welcome to my blog!"
times 	510-($-$$)	db	0	
dw 	0xaa55		

这段汇编代码会使得OS在开机的时候显示 “ Hey! I am Rooeye, welcome to my blog! ”.这句话。

然后对汇编代码进行编译生成二进制文件:

nasm boot.asm -o test.bin

这条命令就可以把汇编文件 boot.asm 转化为二进制文件 test.bin.

2.  生成空白的虚拟软盘映像 a.img, 生成虚拟软盘映像 a.img需要使用工具bximage,见下图:




输入命令 bximage 后:

第一步:输入 hd 或 fd,输入hd表示新建一个空白的虚拟硬盘映像,输入 fd表示新建一个空白的虚拟软盘映像,这里我们输入的是fd新建一个软盘映像。
第二步: 输入虚拟软盘的大小,可以选择  0.16, 0.18, 0.32, 0.36, 0.72, 1.2, 1.44, 1.68, 1.72, 2.88. 单位是MB。 这里我们默认选择 1.44M即可,毕竟引导扇区的大小只有512个字节。
第三步:输入虚拟软盘的名称,默认是 a.img 。

这样我们就建立了一个空白的大小为1.44M的虚拟软盘映像 a.img.

3. 将二进制文件 test .bin的内容拷贝到a.img中, 我们知道一个引导扇区的大小只有512B,这里可以使用linux自带的dd命令进行拷贝。

dd if=test.bin of=a.img bs=512 count=1 conv=notrunc

这里设置 一个block大小为512B,因为boot sector大小只有512B,所以count设置为1即可。   conv = notrunc 的作用是禁止截断, 如果没有设置这个参数,在执行dd指令后a.img的大小会变为和test.bin的大小一样,变为了512B,如果是实际软盘,就不需要设置这个参数,因为物理软盘不存在截断问题。

当设置 conv = notrunc 的时候:



可以看到执行dd命令后 a.img的大小为 1.5M。

当不设置 conv = notrunc 的时候:



可以看到执行dd命令后 a.img的大小为 512B,剩余部分被截断。

4. 配置bochsrc文件,我们这里bochs就相当于一台计算机,a.img就相当于软盘,那么我们必须告诉我们这台计算机的内存多大,磁盘映像使用的是哪个等等。 bochsrc就是对这些参数进行配置。

我们先来看看 bochsrc是什么样子的:

################################################
#configure file for Bochs
################################################
# how much memory the emulated machine will have
megs: 32              # 虚拟机内存为32M

# filename of Rom images, 注意下边要根据你安装目录来调整
romimage: file=/usr/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/share/vgabios/vgabios.bin

#what disk images will be used
floppya: 1_44=a.img, status=inserted

#choose the boot disk.
boot: floppy

#where do we send log messages?
log: bochsout.txt

#disable the mouse
mouse: enabled=0

# enable key mapping, using US layout as default.
keyboard_mapping: enabled=1, map=/usr/share/bochs/keymaps/x11-pc-us.map

megs:用来指明bochs虚拟机内存大小,笔者这里指定为为32M 。
romimage 和 vgaromimage :两个参数的路径根据自己的系统的安装位置来确定 。
floppya: 用来指定bochs使用的具体是哪一个虚拟软盘 。
boot: 指明我们引导磁盘使用的是什么类型,这里我们用的是软盘所以写的是 floppy 。
log:  指明系统日志文件 。
mouse: 是否禁用鼠标 。
keyboard_mapping : 指明键盘布局,这里使用的是美式键盘布局,参数map的路径也是根据自己安装位置而定 。

我们这里要注意对于 bochsrc文件来说,不同版本的bochs在语法上略有不同,必要的时候需要略微改变才可以,如何改变可以参照bochs官方给的sample来定。

5. 启动虚拟机bochs ,在当前目录使用如下命令:

bochs -f bochsrc(这里输入 bochs 即可,bochs命令会自动寻找当前目录下的 bochsrc 文件)

然后虚拟机就启动了,这时控制台会打印出如下画面:



这个时候虚拟机并没有直接运行,而是进入了调试状态,等待我们输入命令才能继续执行。

6. 我们可以输入指令 c,“c”的含义是“继续执行直到遇上断点”,这样我们就可以得到运行结果



红色部分是我们设置的开机显示内容,其余为bochs自带开机显示,可以通过清屏操作来消除。到此为止,一个简单的OS就制作完成啦! 

下篇笔记写如何对一个OS进行调试。

该系列笔记也载于俺的个人网站:    http://zhangjinkun.com  , 欢迎访问。



#C++工程师#
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务