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. Docker存储和网络

    Docker存储资源类型 docker两种存储资源类型 用户在使用 Docker 的过程中,势必需要查看容器内应用产生的数据,或者需要将容器内数据进行备份,甚至多个容器之间进行数据共享,这必然会涉及到 ...

  2. Hive 启动报错,需先启动元数据

    Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException: Unable ...

  3. C#显示及隐藏任务栏

    private const int SW_HIDE = 0; //隐藏任务栏 private const int SW_RESTORE = 9;//显示任务栏 [DllImport("use ...

  4. 00048_this关键字

    1.this调用构造方法 (1)构造方法之间的调用,可以通过this关键字来完成: (2)构造方法调用格式 this(参数列表); (3)小案例 class Person { // Person的成员 ...

  5. ubuntu14.04LTS root登录出现错误

    输入root帐号和密码,出现以下错误: Error found when loading /root/.profile stdin:is not a tty 解决方法: 在终端中用命令:gedit / ...

  6. Windows同步阿里云时间

    Ctrl+R打开cmd命令框 输入:gpedit.msc 计算机配置”—“管理模版”—“系统”—“Windows 时间服务”—“时间提供程序”—“配置 Windows NTP 客户端 双击打开配置 W ...

  7. php.ini配置参数详解

    下面对php.ini中一些安全相关参数的配置进行说明 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 2 ...

  8. hdu6061[NTT推公式] 2017多校3

    /*hdu6061[NTT推公式] 2017多校3*/ #include <bits/stdc++.h> using namespace std; typedef long long LL ...

  9. HackerRank# Red John is Back

    原题地址 简单动归+素数判定,没用筛法也能过 代码: #include <cmath> #include <cstdio> #include <vector> #i ...

  10. BZOJ 1027 [JSOI2007]合金 ——计算几何

    我们可以把每一种金属拆成一个二维向量,显然第三维可以计算出来,是无关的. 我们只需要考虑前两维的情况,显然可以构成点集所形成的凸包内. 然后我们枚举两两的情况,然后可以发现如果所有的点都在一侧是可以选 ...