FAT12格式的引导程序
在上一篇文章中详细介绍了FAT12格式的引导扇区数据结构,详情请浏览:
地址是:http://blog.sina.com.cn/s/blog_3edcf6b80100cr08.html
现在我们来编写一个简单的符合FAT12格式的引导程序,用它来领略一下程序的力量,并以此来敲开操作系统神秘的大门。
其实,只要是在0磁头0柱面1扇区中的指令能加载到7c00h处运行的程序,并且在扇区最后两字节分别是55和AA,就可以称为有效的引导扇区,能成功的引导系统,那么为什么还要大费周章的编写符合FAT12格式的引导程序呢?这样做的好处有以下几点:
1、兼容性佳:FAT12格式是Mirosoft公司开发的标准格式,基本上所有的操作系统都支持FAT12。
2、调试简单:在编写引导程序或操作系统的时候,总是要不断的添加、更新、删除文件以测试程序,使用FAT12格式的时候,只需要将磁盘接上Windows或Linux就可以操作不同的文件。
3、使用方便:为了快速测试程序和不损耗硬件,一般情况下是使用虚拟机加载IMG软盘镜像来达到测试的目的,这时候使用WinImage等软件来操作或编辑标准的FAT12格式的IMG软盘镜像就非常的方便了。
现在来看看这个简单的引导源程序,使用的NASM语法:
;--------------------------------------------------------------------------------
;名称:boot.asm
;用途:符合FAT12格式的引导程序
;作者:土土龙([email protected])
;--------------------------------------------------------------------------------
org 07c00h
jmp short start
nop
BS_OEMName: db 'MSWIN4.1'
BPB_BytsPerSec: dw 512
BPB_SecPerClus: db 1
BPB_RsvdSecCnt: dw 1
BPB_NumFATs: db 2
BPB_RootEntCnt: dw 0e0h
BPB_TotSec16: dw 0b40h
BPB_Media: db 0F0h
BPB_FATSz16: dw 9
BPB_SecPerTrk: dw 12h
BPB_NumHeads: dw 2
BPB_HiddSec: dd 0
BPB_TotSec32: dd 0
BS_DrvNum: db 0
BS_Reserved1: db 0
BS_BootSig: db 29h
BS_VolID: dd 0
BS_VolLab: db ' '
BS_FileSysType: db 'FAT12 '
start:
mov ax,cs
mov ds,ax
mov es,ax
mov ax,BS_OEMName
mov bp,ax
mov cx,8
mov ax,01301h
mov bx,0ch
mov dl,0
int 10h
jmp $
times 510-($-$$) db 0
dw 0aa55h
;--------------------------------------------------------------------------------
;程序结束
;--------------------------------------------------------------------------------
程序非常的简单,首先是使用org 07c00h使程序加载到07c00h处,因为BIOS在搜索引导扇区的时候,会把有效的启动扇区(512B)加载到07c00h处,然后再跳转到这里继续引导操作系统。接着是一个短跳转指令,指向引导代码部分start,这里也可以使用jmp start的普通跳转指令(3字节长),然后把下面的空操作nop删除,作用都是为了操持FAT12数据结构的起始偏移位置为3,标准的Windows或MS-DOS格式的磁盘上的指令都是短跳转,这里为了兼容性所以使用了相同的指令。
接下来的部分一直到start为止,就是FAT12的数据结构,这些字段的取值和用途请参阅“FAT12格式的引导扇区数据结构”(地址是:http://blog.sina.com.cn/s/blog_3edcf6b80100cr08.html),所有字段的取值都是默认值。
代码的开始将ds数据寄存器和es附加数据寄存器的值设置为cs代码寄存器的值相同,即为07c00h,然后调用int10h中断打印OEM字符串。
显示字符串后的代码是jmp $,它的作用是跳转到自己的行中,$表示汇编后的当前行地址,也就是死循环。因为这里只是一个引导程序的简单的例子,所以编写到这里就可以结束了,表现为BIOS引导系统后显示字符串系统就死掉了。
代码times 510-($-$$) db 0的作用是将代码结束后一直到510的空间中填充为0,times是表示重复的关键字(NASM伪代码),$表示汇编后的当前行地址,$$表示汇编后的此节的首地址(即07c00h)。
最后的0aa55是引导结束标志,用低字节在前高字节在后的方式存储,BIOS将根据此标志来验证引导扇区的有效性。
将源文件保存为boot.asm(或其它名称),可以这样将它汇编为纯二进制代码:
nasm boot.asm -o boot.bin
注意:汇编的参数-o是字母o,而不是数字0。
汇编后可以得到512字节长的boot.bin纯二进制代码文件,将这个文件拷贝到软盘的0磁头0柱面1扇区中就可以用它来引导系统了,直接拷贝当然是不可行的,因为无法直接将文件拷贝到磁盘的引导扇区中,下面我们来详细叙述一下如何将这个引导代码文件写入到软盘的引导扇区中。
首先可以使用WinImage或Vitual PC 2007来生成一个软盘的IMG镜像文件,Vitual PC 2007生成的镜像文件后缀名为vfd,将它改成img即可。
1、用Vitual PC 2007生成软盘镜像文件的详细步骤:
首先启动“Microsoft Vitual PC 2007”。
然后点击“文件”下的“虚拟磁盘向导”。
出现“欢迎使用虚拟磁盘向导”时,单击“下一步”。
选择“创建一个新磁盘”,然后单击“下一步”。
注意,这里要选择“虚拟软盘映像”,然后单击“下一步”。
在名称和位置上输入需要保存的目录和文件名称,如“D:\nasm\boot.vfd”,请不要在这里直接将文件的后缀名改为img,而且也改不了。选择“1.44 MB(高密码)”后单击“下一步”。
最后出现“完成虚拟磁盘向导”时,单击“完成”,就可以生成软盘镜像文件了。
然后,我们需要将Vitual PC 2007生成的软盘镜像文件的后缀名改为img。依次单击“开始”、“所有程序”、“附件”、“命令提示符”,就可以DOS方式的命令行界面了。
以刚才的保存镜像文件时输入的“D:\nasm\boot.vfd”为例,输入“D:”命令以切换到D盘,然后输入“CD \nasm”以进入到nasm目录,最后输入“ren boot.vfd boot.img”就可以成功将boot.vfd改成boot.img了。输入“dir boot.img”看看,是不是有一个名称为“boot.img”且长度为1,474,560字节的文件?在“我的电脑”中的相应文件位置也是可以将后缀名修改的,提前是必须显示相应的后缀名,具体步骤请参阅其它内容。
2、用WinImage生成软盘镜像文件的详细步骤:
首先启动WinImage。
打开“文件”菜单,单击菜单中的“新建”命令。
在“格式化选择”中选择“1.44 MB”,然后单击“确定”。
然后打开“文件”菜单,单击菜单中的“保存”命令。
选择镜像文件保存的路径,输入文件名,如boot,保存类型请选择“映像文件 (*.ima)”。IMA和类型和IMG是相同的,无须更改后缀名。
经过以上的两种方式我们生成了一个软盘镜像文件,现在需要将引导代码写入到镜像文件中了。这里也有两种写入的方式,分别详细的叙述操作的步骤。