格式化磁盘的方法 本发明涉及一种格式化磁盘的方法,应用于磁盘的格式化操作。
磁盘(如:硬式磁盘、软式磁片)为电脑的周边设备之一,属于记录媒体的一种,用以存储操作系统、应用程序、数字数据等;不论是硬式磁盘或是软式磁片在使用前都必须先经过“启始”,这个启始的过程就称为格式化(Formatting),目前在DOS和Windows环境下,磁盘的格式化方式可由微软公司提供的“format”指令来进行,通过“format”指令把磁盘分成许多个扇区(Sector),以及由扇区所合成的磁轨(Track);再分别对扇区与磁轨予以编号,并将与扇区、磁轨相关的数据写入预先建立的文件配置表(FAT,FileAllocation Table)与文件目录(File Directory)中,请参阅图1,为一磁盘分割区(Partition)10结构示意图,主要包括有一启动记录11、一第一文件配置表12、一第二文件配置表13、一文件目录14、以及一数据记录区15,其中文件目录是由多个文件目录项141所组成,用以提供与存储于数据记录区15内的数据相关的信息(如:文件名称、附加文件名、时间标示…等等)。但是使用“format”指令格式化磁盘是需要很长时间地,以一容量为3G的硬式磁盘为例,对其进行格式化所需的时间是20分钟,虽然微软公司也有提供快速格式指令-“format/q”,但是它也只能在磁盘不需要完全格式化(在之前已有做过格式化)的情况下才能使用,而且当磁盘有下列情况时也不能进行快速格式化的工作:1.磁盘经低级格式化(Low level format)后。2.磁盘被重新分割(Partitioning)。3.磁盘中某区域区(Sector)受损。
所以,以微软公司所提供的“format”指令对一磁盘作格式化时存有花费时间耗时的问题;以及在以“format/q”指令对磁盘进行快速格式化时,存在有磁盘本身的格式状态的限制(如:磁盘已作低级格式化、或分割已被重新分割…等),也就是说“format/q”指令并不是适用任何的磁盘,仅能对一已经格式化,和未存有受损扇区的磁盘作快速格式化的程序。
本发明的目的在于提供一种能对磁盘(或磁盘分割区)快速格式化的方法,同时更可在磁盘经低级格式化后、重新分割后、以及磁盘中某区扇区受损的情况发生时,仍可对磁盘进行各格式化。
本发明的目的是这样实现的,即提供一种格式化磁盘的方法,应用于一具有一启动记录、一文件配置表、以及一文件目录的磁盘分割区的格式化操作,用以节省格式化的时间,其步骤包括:
a.以一逻辑运算单元取得与该磁盘分割区相关的一磁盘参数;
b.产生一磁盘序号;
c.根据该磁盘参数,以该逻辑运算单元取得该文件配置表的一扇区数;
d.以该逻辑运算单元将该文件配置表的扇区数、该磁盘序号写入该启动记录中的相应位置;以及
e.清除该文件配置表和一文件目录的内容。
本发明还提供一种格式化磁盘的方法,其步骤包括:
a.以一逻辑运算单元取得与该磁盘相关的一磁盘参数,且该磁盘具有一启动记录、一文件配置表、以及一文件目录;
b.产生一磁盘序号;
c.根据该磁盘参数,以该逻辑运算单元取得该文件配置表的一扇区数;
d.以该逻辑运算单元将该文件配置表的扇区数、该磁盘序号写入该启动记录中的相应位置;以及
e.清除该文件配置表和一文件目录的内容。
本发明的技术主要是由BIOS中断的INT 13h读取磁盘格式化所需要的磁盘参数,包括有:磁盘(或磁盘分割区)的总扇区数,启动记录的位置,磁盘(或磁盘分割区)类型及磁盘的编号,以由一逻辑运算单元重新规划磁盘的扇区,并将规划后的结果写入原磁盘(或磁盘分割区)的启动记录内相应的位置。首先观察一磁盘的启动记录的结构,是分为五部分,如下:
1.Jump Instructon (占用3个位组)
2.OEN Name (占用8个位组)
3.DPB (FAT16与FAT32有一定的差别)
4.Bootstrap code (为一段启动程序,以可以使磁盘于格式化后,再
复制I0.dos及command.com两文件后能启动,相当
于执行format/s的效果)
5.以“55aa”结束在以上的结构中,磁盘参数块(DPB,Disc Properties Block)于FAT16与FAT32系统中的结构是不同的,而其他几部分基本上均为固定不变的,请参阅表一和表二,分别列出FAT16与FAT32系统的磁盘参数块的结构,所以本发明的技术重点也就是磁盘参数块中各项内容的计算,由表一和表二中可看出,在FAT16和FAT32系统中磁盘参数块有较大差别,如:在FAT16系统的参数块结构中,文件目录项的最大值为0x0002,但在FAT32系统的参数块结构中,文件目录项的最大值则为0。于是在通过BIOS中断的INT 13h读取磁盘格式化所需要的磁盘参数后,由公式(1)或公式(2)以逻辑运算单元计算出每个文件配置表的扇区数(sfat),写入启动记录的相应位置内,并将文件配置表和文件目录的内容清为零,并在每文件配置表(FAT)的起始部分写入medianumber,于是便完成磁盘(或磁盘分割区)格式化的全部程序。再此值得注意的是FAT32系统的磁盘有三个启动记录,第一个包括DPB与FAT16的启动记录近似,第二启动记录中记录有该磁盘分割区Free Space的大小,以簇(Cluster)为单位,其计算公式为Free Space=(stotal-2×sfat-0x20)/8-1,第三个启动记录属于Bootstrap code,不会影响计算结果。sfat=(stotal-0x21)/(1+s×0x100)+1 (1)sfat=(stotal-0X23)/(1+8×0x080)+1 (2)表一、磁盘参数块的位置在磁盘分割区的第一扇区的0B字元处,FAT16的DPB结构。位置 内容0B-0C每个扇区内的字元数(此处为0x0002,即512)0D每个簇内的扇区数(个数由分割区在大小决定)0E-0F保留扇区(0x0100)10FAT的个数(0x02)11-12文件目录项的最大值(此处为0x0002)13-14扇区总数(当大于65535个时此处为0)15媒体描述符(0xf8)16-17每个FAT的扇区数(由公式(1)计算)18-19每个磁轨的扇区数1A-1B磁头数1C-1D隐藏扇区数(不影响结果)20-2313-14字元处为0时的磁总数24物理驱动器号(第一块0x80,第二块为0x81…)25保留26扩展引导记录的特征字元(为0x29)27-2A磁磁盘序号(随机产生)2B-35标签(共11个字元)36-3D文件系统类型(即FAT 16)
表二、磁盘参数块的位置在磁盘分割区的第一扇区的0B字元处,FAT32的DPB结构。位置 内容0B-OC每个扇区内的字元数(此处为0x0002,即512)0D每个簇内的扇区数(个数由分割区大小决定)0E-0F保留扇区(0x0100)10FAT的个数(0x02)11-12文件目录项的最大值(此处为0)13-14扇区总数(此处为0)15媒体描述符(为0xf8)16-17每个FAT的扇区数(此处为0)18-19每个磁轨的扇区数1A-1B磁头数1C-1F隐藏扇区数(不影响结果)20-2313-14字元处为0时的扇区总数24-27扇区总数(由公式(2)计算)28-29File System Ver(major)(为0即可)2A-2BFile System Ver(minor)(为0即可)2C-2D文件目录头簇号(为0x02000)2E-2F文件目录头簇号的高位元30-31FSINFO Sector number(若无,则为0xffff)32-33Backup Boot Sector(若无,则为0xffff)34-3F保留40物理驱动器号(第一块为0x80,第二块为0x81...)41保留42扩展引导记录的特征字元(为0x29)43-46磁盘序号(随机产生)47-51标签(共11个字元)52-59文件系统类型(即FAT32)
下面结合附图,详细说明本发明的实施例,其中:
图1为磁盘分割区结构示意图;
图2为在FAT16中分割区大小与每簇所含区数的对应关系;
图3为本发明格式化磁盘的处理流程图。
本发明主要是通过BIOS中断的INT 13h来进行磁盘的格式化工作,所以为了有利于下面的说明,首先就将本发明所使用的INT 13h中断的代码02h、03h、08h的功能,以及所使用的寄存器、相关的程序函数说明如下:
(1)功能02h:读取指定数目的磁盘扇区
使用的寄存器:AH 02h(cmd)
AL 要传送的扇区数(nsectd)
ES:BX 指向用户磁盘缓冲区的指针(Buffer)
CH 磁轨数(Track)
CL 扇区数(Sector)
DH 磁头数(Head)
DL 驱动器号(Drive)
在执行后将需要的扇区传入存储区中。其对应的Borland C++语言的函数为:biosdisk(0x02,int drive,int head,int track,sector,int nsects,void×buffer);
(2)功能03h:将指定的存储区域写入设定的磁盘中
使用的寄存器:AH 03h(cmd)
AL 要传送的扇区数(nsectd)
ES:BX 指向用户磁盘缓冲区的指针(Buffer)
CH 磁轨数(Track)
CL 扇区数(Sector)
DH 磁头数(Head)
DL 驱动器号(Drive)
其对应的Borland C++语言的函数为:biosdisk(0x03,int drive,int head,int track,sector,int nsects,void×buffer);
(3)功能08h:返回指定磁盘驱动器的有关信息
使用的寄存器:AH 08h
DL 驱动器号
返回寄存器: CL(低6位)每磁轨的扇区数
DH 磁头数
其对应的Blorand C++语言的函数为:
union REGS inreg,outreg;
unsigned f,g;
inreg.h.ah=8;
inreg.h.al=0x80;【注:磁盘号0x80表示第一块磁盘;0x81表示第二块磁盘,以此类推】
int86(0x13,&inreg,&outreg);
f=(outreg.h.cl&63);
g=ooutreg.h.dh+1;
请参阅图3,为本发明所揭露的技术,其进行磁盘(或磁盘分割区)的格式化的处理步骤依序如下:
步骤101,以一逻辑运算单元由INT 13h中断功能02h获得格式化所需要的磁盘参数,包括有一磁盘(或磁盘分割区)的总扇区数,一启动记录的位置,一磁盘(或磁盘分割区)的类型、以及一磁盘的编号;
步骤102,以逻辑运算单元调用BIOS中断NIT 13h的功能08h,获得每磁轨的扇区数(f)及磁头数(g);
步骤103,随机(Random)产生一磁盘序号(Volume Serial number);
步骤104,判断执行对象(如:磁盘或磁盘分割区)的文件系统的类型是FAT16还是FAT32,若为FAT16执行步骤105,若为FAT32则执行步骤108;因为FAT16与FAT32的磁盘参数块(DPB,Disc Properties Block)不同,所以需要分别处理;
步骤105,取得每个簇的扇区数,这是因为文件系统为FAT16时,每个簇中的扇区数会因分割区增大而以2n的幂形式增长,请参阅图2,为分割区大小16与每个簇所含的扇区数17的对应情形,如图中所示,若磁盘容量是在16MB~127MB之间,则每个簇所含的扇区数为4。
步骤106,根据公式(1),以逻辑运算单元计算文件配置表的扇区数的大小;sfat=(stotal-0x21)/(1+s×0x100)+1 (1)
其中sfat为FAT的扇区数,stotal为总扇区数,s为每簇的扇区数。而公式(1)的推算过程如下:
首先,每个扇区有512个字元;启动记录数为1;根目录扇区数为32;sdata为数据区的扇区数。因此磁盘(或磁盘分割区)中的总扇区数为:
stotal=1+sfat+32+sdata (1-1)
又,FAT中每2个字元指向数据区的一个簇,所以有等式:
sfat×512/2=sdata/s (1-2)
于是(1-2)式经重新整理后,可以表示为:
sdata=sfat×s×256 (1-3)
然后将公式(1-3)代回公式(1-1),则可得
stotal=1+sfat+32+sfat×s×256 (1-4)
最后经整理提出sfat后,即获得
sfat=(statal-33)/(1+s×256)+1 (1-5)
在公式(1-5)中,由于sfat为整数型,所以最后加上1,以弥补舍掉的小数部分,于是将公式化(1-5)为十六进制后便得如公式(1)所示的计算式:
步骤107,以一逻辑运算单元调用BIOS中断INT 13h的功能03h,将步骤106计算所得的扇区的内容,写到启动记录中相应的位置后,并跳至步骤110;
步骤108,根据公式(2),以逻辑运算单元计算FAT扇区数的大小;
sfat=(stotal-0x23)/(1+8×0x080)+1 (2)
其中,sfat为每FAT的扇区数,stotal为总扇区数,s为每簇的扇区数。而公式(2)的算式推算过程如下:
由于目前所格式化的对象为FAT32,所以每4个字元指向一个簇,每个簇含有8个扇区。每个扇区有512个字元;启动记录数FAT16为3;文件目录的扇区数为32;首先根据前述数据可获得一等式:
sfat×512g=sdata/8 (2-1)
经整理后,可另表示为:
sdata=sfat×8×128 (2-2)
将公式(2-2)代入公式(1-1),则可得
stotal=3+sfat+32+sfat×8×128 (2-3)
提出(2-3)式中的sfat,并重新整理可得:
sfat=(stotal-35)/(1+8×128)+1 (2-4)
同样地,在公式(2-4)中,由于sfat为整数型,所以最后加上1是为了补舍掉的小数部分,于是将(2-4)式化为十六进制后便得到公式(2)的计算式。
步骤110,以公式Free Space=(stotal-2×sfat-0x20)/8-1,计算Free Space的大小;
步骤110,以逻辑运算单元调用BIOS中断INT 13h的功能03h,将步骤108计算所得的扇区的内容,分别写入三个启动记录的相应位置中;
步骤111,这次把两个文件配置表和文件目录的内容清为零,供共需清t个扇区,其中t=sfat×2+32,并在每个文件配置表(FAT)的开始写入meadia number,其中FAT16为f8ff;而FAT32为f8ffff0f;以及步骤112,结束格式化。
现有一2G的硬盘,经过“FDISK”指令重新分割后,分为两个逻辑分割区,分别为C和D,其中,D盘的大小为1.2G,当以上述的处理流程对D盘进行快速格式化时,其处理过程如下:
(一)以逻辑运算单元调用BIOS中断INT 13h功能02h获取与磁盘分割
区相关的信息;
用函数biosdisk(2,0x80,0,0,1,1,buffer)可得到以下数据;
(1)磁盘分割区的总扇区数:0x259afl
(2)起始的磁头号:0x01
(3)起始的柱面号:0x96
(4)起始的扇区号:0x01
(5)硬盘序号:08x0(即第一块硬盘)
(6)FAT类型:0x0b(即FAT32)
(二)以逻辑运算单元调用BIOS中断INT 13h功能的08h可得到每磁轨
所含扇区数(f)和磁头数(g)。
union REGS inreg,outreg;
unsigned f,g;
inreg.h.ah=8;
inreg.h.al=0x80;
in86(0x13,&inreg,&outreg);
f=(outreg.h.cl&63);
g=ooutreg.h.dh+1;
得到f=0x3F,G=0xF0;
(三)用函数random( )随机产生磁盘序号
(四)以逻辑运算单元计算文件配置表的扇区数:
sfat=(0x259af1-0x21)/(1+8×0x80)+1=0x965
(五)计算Free Space:
Free Spage=(0x259af1-2×0x965-0x20)/8-1=0x4b101
(六)以逻辑运算单元调用BIOS中断INT 13h功能03h将计算得到的启动记录内容(共3个)写到0x01磁头、0x96柱面、0x01扇区处。
(七)利用循环把2个文件配置表和文件目录的内容清为零,并在每个文
件配置表起始处写入f8ffff0f(media number)。
共需清t个扇区,其中t=sfat×2+32=4842
以上所述仅为本发明的优选实施例,并不限于以上述的硬体的装置实施,举凡任何熟悉此项技术人员在本发明的领域内所做的任何修饰,具有同等功效的,均应含盖于附上的权利要求范围内。
本发明方法的优点在于:
1.本发明通过调用BIOS的中断指令进行计算,重新配置磁盘的启动区、文件配置表(FAT)、以及根目录区的所有内容和位置,可节省大量的格式化时间。
2.本发明适用于FAT16和FAT32两种类型的分割区表。
3.本发明对于已被低级格式化、重新分割、以及磁盘中某区域受损的无法以传统“format/q”指令格式化的磁盘,仍可对其进行快速格式化。