购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.2 创建和使用虚拟机

4.2.1 别害怕,虚拟机是软件

对于第一次听说虚拟机(Virtual Machine,VM)的人来说,可能以为还要再花钱买一台计算机,这恐怕是他们最担心的。所谓虚拟机,就是在你的计算机上再虚拟出另一台计算机来。这台虚拟出来的计算机,和真正的计算机一样,可以启动,可以关闭,还可以安装操作系统、安装和运行各种各样的软件,或者访问网络。总之,你在真实的计算机上能做什么,在它里面一样可以那么做。使用虚拟机,你会发现,在Windows 操作系统里,居然又可以拥有另一套Windows。然而本质上,它只是运行在物理计算机上的一个软件程序。

如图4-5 所示,整个大的背景,是Windows 7 的桌面,它安装在一台真实的计算机上。图中的小窗口,正是虚拟机,运行的是Windows Server 2003。像这样,我们就得到了两台“计算机”,而且它们都可以操作。

虚拟机仅仅是一个软件,运行在各种主流的操作系统上。它以自己运行的真实计算机为模板,虚拟出另一套处理器、内存和外围设备来。它的处理能力,完全来自于背后那台真实的计算机。

尤其重要的是,针对某种真实处理器所写的任何指令代码,通常都可以正确无误地在该处理器的虚拟机上执行。实际上,这也是虚拟机具有广泛应用价值的原因所在。

图4-5 虚拟机的实例

在过去的若干年里,虚拟机得到了广泛应用。为了研制防病毒软件、测试最新的操作系统或者软件产品,软件公司通常需要多台用于做实验的计算机。采用虚拟机,就可以避免反复重装软件系统的麻烦,当这些软件系统崩溃时,崩溃的只是虚拟机,而真实的物理计算机丝毫不受影响。

利用虚拟机来教学,本书不是第一个,国内外都流行这种教学方式。虚拟机利用软件来模拟完整的计算机系统,无须添加任何新的设备,而且与主计算机系统是隔离的,在虚拟机上的任何操作都不会影响到物理计算机上的操作系统和软件,这对拥有大量计算机的培训机构来说,可以极大地节省维护上的成本。

4.2.2 下载和安装Oracle VM VirtualBox

主流的虚拟机软件包括VMWare、Virtual PC 和VirtualBox 等,但只有VirtualBox 是开源和免费的。

要使用VirtualBox,首先必须从网上下载并安装它。这里是它的主页:

通过这个主页,你可以找到最新的版本并下载它。为了方便,下面给出下载页面的链接:

本书的配书文件包中提供了关于如何下载、安装和配置VirtualBox 软件的文档,有WORD 和PDF 两种版本,请选择使用。注意,要选择最新的版本下载,而且,由于该软件针对不同的操作系统平台开发,因此,要下载适用于Windows 的安装程序。

VirtualBox 软件安装完毕之后 ,你需要创建,或者说“虚拟”出一台计算机来,并设置该“计算机”的相关参数,包括为它配备一块硬盘。有关的方法和步骤在配书文件包的教程中已有介绍,唯一的建议是选用本书为你准备的虚拟硬盘。

和真实的计算机一样,虚拟机也需要一个或几个辅助存储器(磁盘、光盘、U 盘等)才能工作。不过,为它配备的并非真正的盘片,而是一个特殊的文件,故称为虚拟盘。这样,当一个软件程序在虚拟机里读写硬盘或者光盘时,虚拟机将把它转换成对文件的操作,而软件程序还以为自己真的是在读写物理盘片。这样的一块磁盘,在需要的时候随时创建,不需要时可以随时删除,这真是非常神奇的磁盘。

前面你已经从网上下载了与本书配套的源码和工具,那是个压缩文件。解压之后,在源代码和工具文件夹里有一个现成的虚拟硬盘文件,文件名是LEECHUNG.VHD,这是给你额外准备的,而且经过了测试,可以在你无法创建虚拟硬盘的时候派上用场。不管是你自己创建虚拟硬盘,还是选用这个现成的,都应当使虚拟硬盘文件位于源代码所在的文件夹,将来往该虚拟硬盘写数据时比较方便。

正如前面所说的,市面上有好几种流行的虚拟机软件,而每种虚拟机软件都企图制定自己的虚拟硬盘标准。因为虚拟硬盘实际是一个文件,所以,所谓虚拟硬盘标准,实际上就是该文件的格式。正是因为这样,虚拟硬盘类型说白了就是你准备采用哪家的虚拟硬盘文件格式。

因为虚拟硬盘实际上是一个文件,所以,通常来说,它的格式体现在它的文件扩展名上。比如上面的LEECHUNG.VHD,采用的就是微软公司的VHD 虚拟硬盘规范。VHD 规范最早起源于Connectix 公司的虚拟机软件Connectix Virtual PC,2003 年,微软公司收购了它并改名为Microsoft Virtual PC。2006 年,微软公司正式发布了VHD 虚拟硬盘格式规范。在本书配套的源代码和工具包里,有该规范的文档。

VDI 是VirtualBox 自己的虚拟硬盘规范,VMDK 是VMWare 的虚拟硬盘规范。采用哪个公司、哪个虚拟机软件的虚拟硬盘格式,对于普通的应用来说,这没什么关系,它们都能很好地工作。但是,对于本书和本书配套的工具来说,你必须选择“VHD(Virtual Hard Disk)”。具体原因,我们将在下一节讲述。

事实上,即使是VHD,也分为两种类型:固定尺寸的和动态分配的。一个固定尺寸的VHD,它对应的文件尺寸和该虚拟硬盘的容量是相同的,或者说是一次性分配够了的。比如,一个2GB 的VHD 虚拟硬盘,它对应的文件大小也是2GB。注意,本书以及本书配套的工具仅支持固定尺寸的VHD。

一旦完成了全部的准备工作,刚刚创建的虚拟机就会显示在VirtualBox 控制台里,如图4-6所示,虚拟机的名字叫“LEARN-ASM”。基本上,你现在就可以单击控制台界面上的“开始”来启动这台虚拟机。但是,别忙,你的虚拟硬盘里还没有东西呢。

图4-6 通过向导程序创建的LEARN-ASM 虚拟机

4.2.3 虚拟硬盘简介

坦白地说,之所以要采用固定尺寸的VHD 虚拟硬盘,是因为其简单性。我们知道,虚拟硬盘实际上是一个文件。固定尺寸的VHD 虚拟硬盘是一个具有“.vhd”扩展名的文件,它仅包括两个部分,前面是数据区,用来模拟实际的硬盘空间,后面跟着一个512 字节的结尾(2004 年前的规范里只有511 字节)。

要访问硬盘,运行中的程序必须至少向硬盘控制器提供4 个参数,分别是磁头号、磁道号、扇区号,以及访问意图(是读还是写)。

硬盘的读写是以扇区为最小单位的。所以,无论什么时候,要从硬盘读数据,或者向硬盘写数据,至少得是1 个扇区。

你可能想,我只有2 字节的数据,不足以填满一个扇区,怎么办呢?

这是你自己的事。你可以用无意义的废数字来填充,凑够一个扇区的长度,然后写入。读取的时候也是这样,你需要自己跟踪和把握从扇区里读到的数据,哪些是你真正想要的。换句话说,硬盘只是机械和电子的组合,它不会关心你都写了些什么。要是手机像人类一样智能,它一定会在坏人使用它的时候无法开机。

在VHD 规范里,每个扇区是512 字节。VHD 文件一开始的512 字节,就对应着物理硬盘的0 面0 道1 扇区。然后,VHD 文件的第二个512 字节,对应着0 面0 道2 扇区,后面的以此类推,一直对应到0 面0 道n 扇区。这里,n 等于每磁道的扇区数。

再往后,因为硬盘的访问是按柱面进行的,所以,在VHD 文件中,紧接着前面的数据块,下一个数据块对应的是1 面0 道1 扇区,就这样一直往后排列,当把第一个柱面全部对应完后,再从第二个柱面开始对应。

如图4-7 所示,为了标志一个文件是VHD 格式的虚拟硬盘,并为使用它的虚拟机提供该硬盘的参数,在VHD 文件的结尾,包含了512 字节的格式信息。为了观察这些信息,我们使用了前面已经介绍过的配书工具HexView。

如图4-7 所示,文件尾信息是以一个字符串“conectix”开始的。这个标志用来告诉试图打开它的虚拟机,这的确是一个合法的VHD 文件。该标志称为VHD 创建者标识,就是说,该公司(conectix)创建了VHD 文件格式的最初标准。

图4-7 VHD 文件的格式信息

从这个标志开始,后面的数据包含了诸如文件的创建日期、VHD 的版本、创建该文件的应用程序名称和版本、创建该文件的应用程序所属的操作系统、该虚拟硬盘的参数(磁头数、每面磁道数、每磁道扇区数)、VHD 类型(固定尺寸还是动态增长)、虚拟硬盘容量等。

说到这里,也许你已经明白我为什么要在书中使用固定尺寸的VHD。是的,因为它简单。为了学习汇编语言,我们不得不在硬盘上直接写入程序。因为VHD 格式简单,所以我只花了很少的时间就开发了一个虚拟硬盘写入程序,作为配书工具让大家使用,这就是下一节将要介绍的FixVhdWr。

至于为什么要使用VirtualBox 虚拟机,是因为它支持VHD,而且是免费的。先前版本的VirtualBox 可以识别VHD,但不支持创建新的VHD,尽管微软公司很早就公开了VHD 规范。好消息是现在的VirtualBox 也可以创建VHD 了。

4.2.4 练习使用FixVhdWr 工具向虚拟硬盘写数据

通常,VHD 是由虚拟机VirtualBox 使用的。应用程序像往常一样,直接针对硬盘进行操作,而在底层,虚拟机将这些硬件访问转化为对文件的读写。

为了在处理器加电或者复位之后能够执行我们写的程序,势必要将这些程序写到硬盘的主引导扇区里,也就是0 面0 道1 扇区,即使是在虚拟机工作环境中,也是这样。

为了做到这一点,需要一个专门针对虚拟硬盘进行读写的工具。我自己写了一个,就在配书源代码和工具里,名叫FixVhdWr。

FixVhdWr 只针对固定尺寸的VHD。当它启动之后,首先需要选择要读写的VHD 文件。如图4-8 所示,一旦这是个合法的VHD 文件,它将读取该文件的结尾,并显示该虚拟硬盘的信息。

注意,因为FixVhdWr 只针对固定尺寸的VHD,所以,如果它检测到该VHD 是一个动态虚拟硬盘,则“下一步”按钮处于禁止状态。

第二步是选择要写入虚拟硬盘的数据文件。毕竟,在任何操作系统中,数据都是以文件的方式组织的,如图4-9 所示。

最后一个界面,是执行写入操作,如图4-10 所示,你应该选择第一种写入方式,即“LBA 连续直写模式”,并指定起始的逻辑扇区号。

图4-8 打开VHD 文件并显示该虚拟硬盘的信息

图4-9 选择要写入虚拟硬盘的文件

图4-10 指定数据写入时的起始逻辑扇区号

通常,一个扇区的尺寸是512 字节,可以看成一个数据块。所以,从这个意义上来说,硬盘是一个典型的块(Block)设备。

采用磁头、磁道和扇区这种模式来访问硬盘的方法称为CHS 模式,但不是很方便。想想看,如果有一大堆数据要写,还得注意磁头号、磁道号和扇区号不要超过界限。所以,后来引入了逻辑块地址(Logical Block Address,LBA)的概念。现在市场上销售的硬盘,无论是哪个厂家生产的,都支持LBA 模式。

LBA 模式是由硬盘控制器在硬件一级上提供支持,所以效率很高,兼容性很好。LBA 模式不考虑扇区的物理位置(磁头号、磁道号),而是把它们全部组织起来统一编号。在这种编址方式下,原先的物理扇区被组织成逻辑扇区,且都有唯一的逻辑扇区号。

比如,某硬盘有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 文件的标识部分)。

检测点4.2

1. 运行NASMIDE 程序,输入以下汇编指令并保存为文件4-2.asm(不要考虑这些指令的含义和功能):

mov ax,0xb800

mov ds,ax

mov [0x00],’a’

mov [0x02],’s’

mov [0x04],’m’

jmp $

2. 将上面的4-2.asm 文件编译,得到二进制文件4-2.bin,并写入虚拟硬盘的主引导扇区。注意,该虚拟硬盘应当是VirtualBox 虚拟机的启动硬盘。

3. 启动你的VirtualBox 虚拟机。当虚拟机启动时,会像真实的计算机一样加载硬盘上的主引导扇区代码,并执行。此时,注意观察屏幕上都显示了什么内容。 iQ2l0T0PWRdci4D2Ae2ml1//+erYq/xGXsPTHswsJOiwsTKcAoj57OlDckSOEqkY

点击中间区域
呼出菜单
上一章
目录
下一章
×