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. vscode python code-runner 中文乱码解决

    https://www.cnblogs.com/zhaoshizi/p/9050768.html 这里我使用的是第二种方法

  2. Exchange 正版化 授权

    网友说法: Exchange服务器版其实价格不高,企业版也就是几万左右,贵的是客户端授权,一个客户端授权大概要300多.但是,但是,中国企业买Exchange客户端一般都是可以按比例买的,比如10%- ...

  3. Python 编程要求

    1.添加前缀 #!/usr/bin/env python # -*- coding:utf-8 -*- 2.py文件.函数都要写好注释 3.主函数要加上判断 if __name__ == " ...

  4. 只操作git(cmd)就可以使用git将项目上传到github

    代码改变世界 使用git将项目上传到github(最简单方法) 首先你需要一个github账号,所有还没有的话先去注册吧! https://github.com/ 我们使用git需要先安装git工具, ...

  5. POJ 2396 Budget ——有上下界的网络流

    给定矩阵的每行每列的和,和一些大于小于等于的限制.然后需要求出一组可行解. 上下界网络流. 大概的思想就是计算出每一个点他需要强行流入或者流出的量,然后建出超级源点和汇点,然后删除下界,就可以判断是否 ...

  6. UVA 11297 Census ——二维线段树

    [题目分析] 二维线段树模板题目. 简直就是无比的暴力.时间复杂度为两个log. 标记的更新方式比较奇特,空间复杂度为N^2. 模板题目. [代码] #include <cstdio> # ...

  7. BZOJ 3750: [POI2015]Pieczęć 【模拟】

    Description 一张n*m的方格纸,有些格子需要印成黑色,剩下的格子需要保留白色. 你有一个a*b的印章,有些格子是凸起(会沾上墨水)的.你需要判断能否用这个印章印出纸上的图案.印的过程中需要 ...

  8. BZOJ2245 [SDOI2011]工作安排 【费用流】

    题目 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产品必须完整地由一名 ...

  9. [USACO5.3]Big Barn (动态规划)

    题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N x N 的方格.输入数据中包括有树的 ...

  10. 关于内存 转载自http://blog.csdn.net/xluren/article/details/8150723

    首先感谢下原作者,写的真的非常明白,非常详细 1.预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局 ...