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语法:

  1.     ;--------------------------------------------------------------------------------
  2.     ;名称:boot.asm
  3.     ;用途:符合FAT12格式的引导程序
  4.     ;作者:土土龙(hyh315@163.com)
  5.     ;--------------------------------------------------------------------------------
  6.     org 07c00h
  7.     jmp short start
  8.     nop
  9.     BS_OEMName: db 'MSWIN4.1'
  10.     BPB_BytsPerSec: dw 512
  11.     BPB_SecPerClus: db 1
  12.     BPB_RsvdSecCnt: dw 1
  13.     BPB_NumFATs: db 2
  14.     BPB_RootEntCnt: dw 0e0h
  15.     BPB_TotSec16: dw 0b40h
  16.     BPB_Media: db 0F0h
  17.     BPB_FATSz16: dw 9
  18.     BPB_SecPerTrk: dw 12h
  19.     BPB_NumHeads: dw 2
  20.     BPB_HiddSec: dd 0
  21.     BPB_TotSec32: dd 0
  22.     BS_DrvNum: db 0
  23.     BS_Reserved1: db 0
  24.     BS_BootSig: db 29h
  25.     BS_VolID: dd 0
  26.     BS_VolLab: db '           '
  27.     BS_FileSysType: db 'FAT12   '
  28. start:
  29.     mov ax,cs
  30.     mov ds,ax
  31.     mov es,ax
  32.     mov ax,BS_OEMName
  33.     mov bp,ax
  34.     mov cx,8
  35.     mov ax,01301h
  36.     mov bx,0ch
  37.     mov dl,0
  38.     int 10h
  39.     jmp $
  40. times 510-($-$$) db 0
  41.     dw 0aa55h
  42.     ;--------------------------------------------------------------------------------
  43.     ;程序结束
  44.     ;--------------------------------------------------------------------------------
 

程序非常的简单,首先是使用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是相同的,无须更改后缀名。

经过以上的两种方式我们生成了一个软盘镜像文件,现在需要将引导代码写入到镜像文件中了。这里也有两种写入的方式,分别详细的叙述操作的步骤。

【转载】FAT12格式的引导程序的更多相关文章

  1. 【转载】FAT12格式的引导程序(2)

     1.用WinImage来写入到引导区的详细步骤: 启动WinImage后,打开“文件”菜单,单击菜单中的“打开”命令. 选择之前保存的磁盘镜像文件“boot.img”或者“boot.ima”. 打开 ...

  2. FAT12格式的引导区实现

    org 07c00h ;================================================ jmp short START nop ; 这个 nop 不可少 ;这个结构将 ...

  3. 关于SQL优化(转载,格式有调整)

    一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...

  4. 【转载】FAT12文件系统之引导扇区结构

    FAT12文件系统之引导扇区结构 文件系统即文件管理系统,是操作系统的重要组成部分之一,如果需要开发底层磁盘驱动或编写自己的操作系统,就必须详细了解文件系统. FAT12是Microsoft公司DOS ...

  5. 汇编语言进阶和Makefile进阶---第二天

    摘要: 原创博文:转载请标明出处:http://www.cnblogs.com/zxouxuewei 首先加载启动代码: ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序装载地 ...

  6. 自制操作系统 (三) 从启动区执行操作系统并进入C世界

    qq:992591601 欢迎交流 2016.04.03 2016.05.31 2016.06.29 这一章是有些复杂的,我不太懂作者为什么要把这么多内容都放进一天. 1读入了十个柱面 2从启动区执行 ...

  7. [自制简单操作系统] 1、从0-1到汇编再到c语言的奥秘

    目录: 1.用0-1编写最简单的操作系统 2.用汇编改写上面0-1程序 2.1 只用DB的汇编改写版  2.2 加入RESB汇编的改写版  2.3 进一步使用汇编替换0-1文件  2.4 核心程序也用 ...

  8. 自制操作系统(二) 让bootsector开机启动打印一首诗

    qq:992591601 欢迎交流 2016-03-31作 2016-06-01.2016-06-27改 我总结了些基本原理: 1.软盘的第一个扇区为启动区 2.计算机读软盘是以512字节为单位来读写 ...

  9. Windows文件系统

    微软在Dos/Windows系列操作系统中共使用了6种不同的文件系统(包括即将在windows的下一个版本中使用的Winfs).它们分别是:FAt12.FAT16.FAT32.NTFS.NTFS5.0 ...

随机推荐

  1. Java单例模式简单实现

    代码 public class Singleton { private static Singleton singleton;//创建一个单例对象 public static Singleton ge ...

  2. 面试准备——redis

    https://blog.csdn.net/yangzhong0808/article/details/81196472 http://www.imooc.com/article/36399 http ...

  3. Palindromic Paths(DP)

    描述 Given an N×N grid of fields (1≤N≤500), each labeled with a letter in the alphabet. For example: A ...

  4. window.location.href跳转问题

    任务中遇到这样一个问题,用window.location.href跳转一到个网址,但是每次都出错,显示网址前面加上了文件所在文件夹的路径 示例如下: window.location.href=&quo ...

  5. 【Luogu】P1516青蛙的约会(线性同余方程,扩展欧几里得)

    题目链接 定理:对于方程\(ax+by=c\),等价于\(a*x=c(mod b)\),有整数解的充分必要条件是c是gcd(a,b)的整数倍. ——信息学奥赛之数学一本通 避免侵权.哈哈. 两只青蛙跳 ...

  6. BZOJ2241 [SDOI2011]打地鼠 【模拟】

    题目 打地鼠是这样的一个游戏:地面上有一些地鼠洞,地鼠们会不时从洞里探出头来很短时间后又缩回洞中.玩家的目标是在地鼠伸出头时,用锤子砸其头部,砸到的地鼠越多分数也就越高. 游戏中的锤子每次只能打一只地 ...

  7. JCaptcha+Memcache的验证码集群实现

    一.问题背景 为了防止垃圾信息发布机器人的自动提交攻击,采用CAPTCHA验证码来保护该模块,提高攻击者的成本. 二.验证码简介 全自动区分计算机和人类的图灵测试(Completely Automat ...

  8. ReSharper7.1.25.234 注册机

    经常用vs做开发的人都知道,ReSharper是vistual studio必备插件之一.他的智能提示,智能感知,.net底层方法查看,测试等都非常方便,给程序员带来了巨大的效率. 但众所周知ReSh ...

  9. Jsp中路径问题

    ${pageContext.request.contextPath}”的作用是取出部署的应用程序名,这样不管如何部署,所用路径都是正确的. <!--使用绝对路径的方式引入CSS文件-->& ...

  10. Struts2的验证框架简单吗?

    Struts2验证框架是基于Struts拦截器开发的,具有良好的扩展性:一般的验证都可以支持.现在我们以一个注册验证的例子进行总结: 新建一个model,User: public class User ...