Foxdisk是基于BIOS中断或者直接访问硬件的,在设计的时候,第一个需要考虑的问题就是软件如何运行。这个问题很有趣,也是我在早期开发一个小的OS时试图搞清楚的最初的问题。
作为介于BIOS和操作系统间的一个小程序,我考虑了两种让Foxdisk运行的方法。其一是依靠硬件,将Foxdisk的引导代码放在PCI ROM或者以Option ROM的形式直接嵌入到BIOS中;另外一种是类似GRUB的方式,修改硬盘的MBR,实现Foxdisk的引导。我们首先从PC的启动过程谈起。
1) PC启动的过程
图1 计算机启动过程
这是我理解的计算机的启动过程,显示了计算机从开机到进入操作系统的工作顺序。在上述的几个阶段,都可以抢得控制权,实现我们自己的代码。分别为:
阶段①:Call Rom,此阶段Option ROM可以抢得计算机的控制权。
阶段②:int19h,Option ROM软件可通过修改int 19h抢得控制权。另外,所有通过模拟可引导设备的Option ROM以使得BIOS能够引导其软件的方法均归于此阶段。
阶段③:LoadMBR,通过直接修改硬盘上的MBR区域抢得控制权。
阶段④:Load OS,在操作系统引导的时候抢得控制权。
阶段⑤:在操作系统层面安装软件。
阶段①~④均称为底层阶段,软件一般直接与计算机硬件打交道,或者通过BIOS中断访问硬件。阶段⑤称为上层阶段,软件借助于操作系统提供的各种API工作。
关于Option ROM的介绍,可以参考文档《BIOS Boot Specification》version 1.01。这是发布于1996年的文档,由intel、Phoenix和Compaq联合制定的规范。多年来,BIOS的启动过程也没有太大的变化,直到UEFI的出现。
具体的内容我不在博客中介绍,文档中介绍得很清楚。只要记住两点即可:第一,BIOS允许外设有自己的代码,用来实现一些特殊的功能,比如网卡的Option ROM、PCI设备的Option ROM;第二,只要依据一定的规范来写代码,BIOS会将控制权转移给Option ROM,这时整个计算机的控制权都在手中,理论上做什么都可以。
2) 方案选择
我做了一些实验。用沁恒电子的WCH365做了一些PCI ROM的设备,改造了自己之前
写的Option ROM代码,结合Foxdisk2.0的代码,设计了一个粗糙的原型。代码能很好的工作,我甚至考虑是不是可以作为一个产品来做。
最终我还是选择了类似GRUB,修改硬盘MBR的方式来编写Foxdisk3.01。主要是基于几个考虑:一是这两种方式的很多代码是可以共用的,开发完其中一种,另外一种花个一两周时间就能实现;二是PCI ROM的方式不好调试,我大部分时间在家开发,没有硬件的情况下看不到实现效果。
3) Foxdisk 3.01程序架构设计
图2 硬盘布局图
图中给出了Foxdisk在硬盘上的布局。LBA 0处是MBR区域,被替换为Foxdisk的引导代码。Foxdisk的代码和使用的资源全部放在硬盘的最后面,主要包括:
Para—程序中用到的一些参数,比如倒计时时间、壁纸号码等等,其结构见Common.h
中的struct FoxdiskPara;
os—–每个操作系统所用到的一些资源,比如操作系统名字,是否需要设置密码等;
osmbr-每个操作系统本身的引导区代码;
code&data—Foxdisk3.01的代码和数据;
wallpapers—Foxdisk3.01的启动界面所用到的壁纸,最多可以存放7张,在安装的时候指定。
以上的二进制码都存放在硬盘的相应位置,是由Foxdisk安装程序负责管理安装的。
特别要说明的是,SETMAX_LBA是作为一个概念存在的。以前总是遇到有客户要求将系统隔离,即放在硬盘前端的系统不能访问硬盘后端的系统, ATA标准中是提供了这样的命令的,即SetMax的命令,我预留了这样的机制,但是并没有去实现它。举例说明,假设硬盘有1000个磁道,操作系统安装在前面,占用了300磁道。使用SetMax指令,设置max为600。那么操作系统是无法访问600之后的磁盘的,这样就实现了一定程度的数据保护。
4) 看一看安装过程
我大部分的开发过程中,都是使用Virtual PC5.2来辅助调试的,一般直接使用debug.exe或者tddebug.exe。但是这种调试只能在dos下才能使用,如果要完整的调试整个加载过程,就必须用到bochs了。具体的调试,在之后的章节中再详细描述。我们首先来看看Foxdisk3.01的安装程序。
图3 安装程序界面
安装程序提供了几个功能,管理新系统的添加、壁纸的管理、重新修正Foxdisk的引导代码。秀一下我更换的壁纸:
图4 壁纸效果
整个安装过程还是比较简单的,并且大部分复用了Foxdisk主程序中的实现代码。不过在使用过程中,仍旧时不时的会出现一些小BUG,我目前也没有精力再去调试修正了。正像我之前所说的,Foxdisk的编写,纯粹是出于兴趣,实现自己心中想编写一个小小操作系统的梦想。
下一篇,开始进入安装程序的代码分析,看看它是怎么管理Foxdisk的资源,怎么将Foxdisk的主程序和引导代码安装到硬盘中。
3,767 total views, 1 views today