一个操作系统的实现01

来源:互联网 发布:哪个软件购票方便 编辑:程序博客网 时间:2024/05/15 05:47

计算机的启动

学计算机的人应该都知道计算机的大致启动流程,我首先简单的概括一下,当我们按下计算机启动按钮时,计算机系统会进入到一个叫BIOS(Basic Input and Output System)的地方,这其实时一个软件系统,也就是一些程序,是被烧入到主板上的,系统开机后会进入这里的程序并且执行,这段程序主要的功能就是检测基本的硬件如显示器,内存,硬盘,键盘等有没有问题,如果有硬件问题,系统就会做出相应提示。注意一直到这里包括程序在这里运行和我们的硬盘都还没有什么关系,既没有访问硬盘里面的数据也没有往里面写数据。
接下来将和硬盘打交道了,BIOS从启动设置里面读取到启动设备,比如说我们将硬盘设置为启动设备(当然也可以是U盘,光驱等),硬盘是如果启动一个庞大的操作系统的呢?大体过程是这样,首先读取硬盘的前512自己,也就是第一个扇区(扇区大小一般都是512byte),找到启动分区,然后将代码跳转到这个分区去执行,整个操作系统开始启动。

系统的启动详情请参考 阮一峰的博客,这里要谢谢博主分享的好文章


到此为止,大家应该都知道了系统的启动过程,接下来我们就要玩真的了,过程是这样的因为bios会加载前512字节并开始执行,我们就在这前512字节里面写一个“微型系统”,其实就是打印一个hello word ,呵呵

需要的软件
Bochs (虚拟机)
Nasm (汇编器)
我用的计算机系统(Ubuntu14.04)

现在来看汇编代码

; boot.asm org 07c00h   ; 指定将程序加载到相应的内存位置mov ax,csmov ds,axmov es,ax call DispStrjmp $   ; 无限循环 infinite loop,让系统停在那里DispStr:mov ax,BootMessagemov bp,axmov cx,16mov ax,01301hmov bx,000chmov dl,0int 10hretBootMessage:    db "Hello World!"times 510-($-$$) db 0 ; NASM中 $代表当前行, $$代表当前段(SECTION开始的地方),这句的作用是,将从当前行开始,一直到填充0一直到510个字节dw 0xaa55

1、现在开始编译:

nasm boot.asm -o boot.bin

2、生成虚拟软盘,用的是虚拟机Bochs提供的软件,bximage
首先直接输入bximage,命令行会引导你创建,这里给出图例
直接用默认的选项,我们最后就得到了一个a.img文件

3、现在要做的就是将我们的引导文件boot.bin写入到我们的虚拟软盘中, 用 dd 这个工具

dd if=boot.bin of=a.img bs=512 count=1 conv=noturnc
if:指的是输入文件 of:指的是输出文件
bs:指的是一次性写出去多少字节
count:指的是重复总数,这里为1表示,只写一次
conv=notrunc (注:no truncate) 表示不要截断,因为我们的软盘有1.44M,而内容只有512byte,如果不指定的话,a.img最后就只有512byte了

这里我们就得到了一个可以启动的软盘了
最后运行就是这样了,其中红色的Hello World!是我打印的,其他的是BIOS打印的
这里写图片描述

0 0
原创粉丝点击