[原创]《一个64位操作系统的设计与实现》中的一个小坑
最近在看《一个64位操作系统的设计与实现》,书上从第七章开始需要先将U盘格式化为USB-FDD,然后在真机上软盘启动U盘里的系统,作者玩得不亦乐乎,然而作为学习的读者,这很不方便,而且,书中的系统竟然是格式化U盘为FDD并以软盘启动,但VMWARE并不支持软盘启动,现在找到了一个办法,格式化U盘为HDD并可以在VMWARE上硬盘启动U盘里的系统,只需要稍加操作即可。
附件为boot.asm和loader.asm中的代码。
按照以下步骤进行:
1、 首先用DiskGenius清空数据并格式化为HDD



2.格式化后U盘内会有很多来自DiskGenius的引导数据,这些数据可以删也可以不删,最好是删掉。

3.书本的7-1代码示例中的boot.asm修改两个部分
第一个部分是引导扇区的标志信息以及3个变量的数值,需要结合DiskGenius在“分区参数”中提供的信息来修改这些数值:


第二个部分是在函数Func_ReadOneSector中,int 13h的dl寄存器是驱动器号,由于书中是格式化为软盘,所以驱动器号为0也无所谓,但格式化为硬盘后,驱动器号是由DiskGenius决定的。
将mov dl,0改为mov dl,[BS_DrvNum]

4.使用nasm编译为boot.bin和loader.bin后,使用下面的指令将boot.bin拷贝到U盘内
dd if=boot.bin of=/dev/sdb bs=512 count=1 seek=1 conv=notrunc
由于硬盘的0号扇区是HDD引导扇区,之后才是主磁盘分区的引导扇区,所以要加上seek=1指定拷贝到U盘的1号扇区。
将loader.bin直接拷贝到U盘中。
5.用VMWARE启动U盘
先在VMWARE中找一个已关闭的虚拟机,我这里用的就是CENTOS6.1,点击“编辑虚拟机设置”->”硬件”->”添加”。

选择”硬件”->”下一步”->”SCSI”->”下一步”->”使用物理磁盘”。

选择设备“PhysicalDrive1”(或者你U盘可能在其他磁盘)->”使用整个磁盘”->”下一步”->设置一下名字->”完成”。

接着启动虚拟机,狂按F2进入Setup模式,在Boot栏的Hard Drive项里将Vmware VirtualSCSI Hard Drive(0:1)提到Vmware VirtualSCSI Hard Drive(0:0)的前面,这样就会加载U盘里的系统,而不是虚拟机自身的系统。

最后Exit->Exit Saving Changes->Yes,虚拟机会重新启动,就可以看到下图。

