本书所需要的虚拟机不需要操作系统,因为我们只在裸机上工作,也就是在只有硬件而没有操作系统的计算机上工作,所以我们只能编写一个主引导程序,将它写入硬盘的主引导扇区,让计算机加电或者复位之后能够执行,即使它只是一个虚拟机。
主引导扇区不大,只有512字节,所以还必须编写一个类似于操作系统的内核来演示操作系统的原理和功能。
为了将程序写入虚拟硬盘,需要一个专门针对虚拟硬盘进行读写的工具。我自己写了一个,就在配书源代码和工具里。这个软件工具有两个版本,一个是FixVhdWr32.exe,适用于32位的Windows;一个是FixVhdWr64.exe,适用于64位的Windows。注意,32位的版本可以运行在32位或者64位Windows上,而64位的版本只能运行在64位的Windows上,请注意根据你的实际情况选用。为了方便,不管是32位版本,还是64位版本,我们以后统称FixVhdWr。
如图1-8所示,这是FixVhdWr的界面。第一次运行这个软件时,你需要在界面顶部选择一个虚拟硬盘文件。FixVhdWr只针对固定尺寸的VHD,如果选择的是一个合法的VHD文件,它将显示该虚拟硬盘的信息。
在软件界面的中间部分,你可以添加要写入虚拟硬盘的数据文件。在这个过程中,会弹出额外的界面,让你指定文件的位置和名称,以及写入时的起始逻辑扇区号,也就是所谓的起始LBA扇区号。那么,什么是LBA扇区号呢?
通常,一个扇区的尺寸是512字节,可以看成一个数据块。所以,从这个意义上来说,硬盘是一个典型的块(Block)设备。
机械硬盘每个盘面上都有一个磁头(Head),而每个盘面被划分为若干磁道(Cylinder),每个磁道又被划分为若干个扇区(Sector)。传统的硬盘读写要指定磁头号、磁道号和扇区号。采用磁头、磁道和扇区这种模式来访问硬盘的方法称为CHS模式,但不是很方便。想想看,如果有一大堆数据要写,还得注意磁头号、磁道号和扇区号不要超过界限。所以,后来引入了逻辑块地址(Logical Block Address,LBA)的概念。现在市场上销售的硬盘,无论是哪个厂家生产的,都支持LBA模式。
LBA模式由硬盘控制器在硬件一级上提供支持,所以效率很高,兼容性很好。LBA模式不考虑扇区的物理位置(磁头号、磁道号),而是把它们全部组织起来统一编号。在这种编址方式下,原先的物理扇区被组织成逻辑扇区,且都有唯一的逻辑扇区号。
图1-8 FixVhdWr的界面
比如,某硬盘有6个磁头,每面有1000个磁道,每个磁道有17个扇区。那么:
逻辑0扇区对应着0面0道1扇区;
逻辑1扇区对应着0面0道2扇区;
……
逻辑16扇区对应着0面0道17扇区;
逻辑17扇区对应着1面0道1扇区;
逻辑18扇区对应着1面0道2扇区;
……
逻辑33扇区对应着1面0道17扇区;
逻辑34扇区对应着2面0道1扇区;
逻辑35扇区对应着2面0道2扇区;
……
要注意到,扇区在编号时,是以柱面为单位的。即,先是0面0道,接着是1面0道,直到把所有盘面上的0磁道处理完,再接着处理下一个柱面。之所以这样做,是因为我们讲过,要加快硬盘的访问速度,最好不移动磁头。
因为这里总共有102000个扇区,故后一个逻辑扇区的编号是101999,它对应着5面999道17扇区,这也是整个硬盘上最后一个物理扇区。
这里面的计算方法是:
这里,LBA是逻辑扇区号, C 、 H 、 S 是想求得逻辑扇区号的那个物理扇区所在的磁道号、磁头号和扇区号。
采用LBA模式的好处是简化了程序的操作,使得程序员不用关心数据在硬盘上的具体位置。对于本书来说,VHD文件是按LBA方式组织的,一开始的512字节就是逻辑0扇区,然后是逻辑1扇区;最后一个逻辑扇区排在文件的最后(最后512字节除外,那是VHD文件的标识部分)。
如图1-8所示,FixVhdWr程序可以选择多个数据文件,这些数据文件最终都会从指定的起始逻辑扇区号开始写入虚拟硬盘。在数据文件添加成功后,会显示在列表框中。如果需要在列表框中去掉某个数据文件,只需要单击选中它,再选择“删除文件”即可。
在软件界面的下部,你可以指定VirtualBox虚拟机软件的路径名,但前提是你已经安装了这个虚拟机软件。
上面设置的一系列文件和参数会被保存在配置文件中,当你下次再启动FixVhdWr软件时,这些内容都会自动恢复,不需要你再次选择、添加和设置。
在界面的底部是一排按钮,“写入”按钮用来将列表框里的数据文件按指定的位置写入虚拟硬盘。写入虚拟硬盘之后,通常还要在虚拟机中观察运行效果。为了方便,单击“写入并执行VBox虚拟机”按钮,以执行数据文件的写入操作,然后启动VirtualBox虚拟机软件。