上海11选5开奖结果

硬盘的数据结构

2020-06-28 15:12:00
admin668
原创
186
硬盘只有建立起完整的数据结构,才能正常使用。数据结构由六部分组成,分别是主引导记录、主分区表和分区表链、分区引导记录、文件分配表、文件目录表以及数据区。了解硬盘的数据结构,是对硬盘物理扇区进行读写编程的基础
特别是本书介绍的通过读取扇区数据来恢复文件的方法,已经完全不用考虑被操作硬盘安装的是什么操作系统,甚至不用考虑硬盘上还有没有操作系统。因为这种恢复文件的方法,是通过调用BIOS磁盘服务程序来完成的,而BIOS对硬盘的管理级别高于所有的操作系统但是这种操作必须了解有关的数据结构和文件的存储方式,才能按照文件的存储规律将它们恢复岀来。因此,了解硬盘的数据结构,是学习本书编程技术必须具备的重要基础知识之从本章开始要为以后学习物理扇区读写编程做一些必要的准备,介绍一些必备的常识这期间为了对物理扇区寻址,经常要进行繁琐的数学运算。为了使运算过程更简明、直观容易被读者理解,笔者以自己使用的一块IBM生产的18G硬盘作为标本,为全书所有的数学运算和编程提供参照
笔者使用的硬盘分为一个主分区C和一个扩展分区,扩展分区又分成D、E、F、G四个逻辑驱动器,C也是一个逻辑驱动器。从C到F四个逻辑驱动器的容量都是2047M,采用FAT6分区格式,逻辑驱动器G的容量是9170M,采用FAT32分区格式。这块硬盘虽然容量小点,但因为是scSI硬盘,所以速度很快。硬盘上安装了两个操作系统,C盘安装WINDOWS98第二版:D盘安装 WINDOWS200 PROFESSIONAL,采用双启动方式安装常将逻辑驱动器看作一个独立的盘,所以笔者硬盘中的五个逻辑驱动器,今后在叙述中就简称为C盘、D盘、E盘、F盘和G盘
21主引导记录
硬盘的主引导记录也称MBR,位于0柱面0磁头1扇区。该扇区的512个字节有三部分内容,除了主引导记录外,还有分区表和结束标志55AA主引导记录的作用非常重要,它是硬盘启动时最先加载的扇区数据。下面通过分析硬盘的启动过程,来说明它的重要性
1.计算机系统接通电源以后,主板BOS加电进行自检。自检的内容很多,是一个很复杂的过程,这里只介绍与硬盘有关的部分。
2.将硬盘第一个扇区,也就是0柱面0磁头1扇区读入内存3.检査结束标志,也就是扇区最后两个字节的值是否等于a55H(存储顺序是低字节在前,高字节在后)。若不等则打印屏幕提示,然后死机。
4.执行主引导记录中的程序,将控制权转交给主引导程序5.主引导程序首先将自己读入内存,然后查找在分区表中是否有活动分区。找到活动分区以后,将分区引导记录读入内存6.检查结束标志是否等于a55H,然后执行分区引导记录中的启动程序,将控给操作系统
7.操作系统加载系统文件,计算机启动
通过对以上过程的分析可以看出,如果主引导记录不正常,后面所有的启动过程都不能正常执行。
有一种特殊情况,使计算机启动过程的前两步与上面介绍的不一样。如果硬盘上安装了多系统引导软件,如 Partition Magician分区软件,则该软件将主引导记录替换成自己的一程序。这段程序将BIOS引向软件设置的专用分区,然后根据操作者的选择激活某一个分区再进入正常的启动过程。类似 Partition Magician这样的分区软件还有很多,它们各有自己的特点,这些都不在本书的讨论范围之内。
通常情况下,一块硬盘上只有一个主引导记录。
主引导记录扇区所在的磁道,通常被称为0磁道,它属于隐藏磁道,这个磁道的63个扇区属于隐藏扇区。操作系统的所有命令,除了 FDISK以外都不能访问它们。就连格式化程序 FORMAT,对它们也无能为力。
正因为如此,0磁道的63个扇区就成了一些病毒程序代码、操作系统的引导代码、应用软件用于自我保护的识别标记、BIOS功能扩展程序代码的栖息之地。
由于IT3H中断能调用BIOS磁盘服务程序,直接对硬盘物理扇区进行操作,并且这种操作与分区无关。所以要想读写硬盘0磁道的某个扇区,在程序中使用NT3H中断调用功能即可达到目的
使用调试程序 DEBUG,通过INTH中断调用可以读出这些扇区内容,DEBUG程序应在DOS实模式下执行。
所有对NT3H中断的调用都应在DOS实模式下运行,因为 WINDOWS95以上的操作系统都是保护模式,对INT13H中断调用的支持不尽相举例来说,WINDOWS95不支持INT3H中断调用;而 WINDOWS98在DOS窗口下支持INT13H中断调用;WINDOWS2000不支持IT13H中断调用,但可以使用AP函数CreateFile对物理扇区进行读写
为了将程序的编译和运行环境统一起来,本书中所有程序统一使用DOS实模式,可以是DoS622、DOS70和DOS71本书介绍的工具程序和应用范例,是指硬盘处于不正常状态时,如何利用硬盘物理扇区卖写技术修复数据结构和恢复文件。在这种情况下,是不可能启动被修复硬盘上的 WINDOWS系统的。
在硬盘不能启动的情况下,可以有两种操作模式。第一种模式是用软盘启动,在软盘上行有关的工具程序,对硬盘扇区进行读写操作。这种操作模式简便易行,但程序的运行速度比较慢。第二种模式是用一块正常的硬盘启动,运行有关的工具程序,这块硬盘设置为第硬盘。将不能启动的硬盘设置为第二硬盘,在ⅣNTI3H中断调用的入口参数中,把有关寄存器的参数设定为81H,就能对有问题的硬盘扇区进行读写操作。
22分区表
分区表占用0柱面0磁头1扇区的64个字节,位移从1beH到1fdH。它共有四个分区表项,每个分区表项占16个字节。一般只使用两个表项,另外两个表项全为0分区表项的格式如表2-1所示。(注:表2-1中的偏移量和字节编号是第一个表项的值后面的表项按照相同的规律递增)
通常说的分区表指的是主分区表,另外在扩展分区的每一个逻辑驱动器中,都有一个分链表,对它们的解读方法基本是相同的。
下面将结果21中的两个分区表项单独列出来,详细地进行分析分区表项一:(位移IbeH至lcdH,编号447到462)
第一个分区表项记录的是本分区的有关参数
将16个字节按表21的格式分为八段,分别进行说明四、五段与表中的内容一样,不必重复
第三段是两个字节,组成一个字。如何从中算出扇区值和柱面值,请参阅对第六段的分析。
第六段也是一个字,存储顺序低字节在前,高字节在后。7H的低6位表示扇区值,高2位与后面04H连成10位,表示柱面数。为了更直观地说明这种换算规律,先用二进制表示它们,最后再换算成十进制。7H转成二进制“0111B”,它的低6位转换为十进制
“11113”=63。高2位“01B”与04H的二进制“0000008”合成10位二进制数
“01000000”,转为十进制是260。最后得到分区结束扇区值是63,柱面值是260为什么要详细地解说这种运算过程?因为今后在编程时这种运算经常用到,稍有疏忽就会出错
第七段是一个双字,存储顺序低字节在前,高字节在后,写成十六进制是00000H,十进制是63第八段是一个双字,它的值是十六进制003fa86H,十进制为4192902第七段和第八段的两组数据在利用扩展INT13H中断进行物理扇区寻址时非常有用。现在先简要说明一下,更详细的内容在“工具篇”里再作介绍。
扩展INT3H中断调用不再使用前面介绍的CHS寻址方式,改用线性寻址方式,扇区编号从0开始,前面说的0柱面0磁头1扇区在线性寻址方式下就是0号扇区。
用0加上第七段的值63,就是存放C盘分区引导记录的扇区地址。63再加上第八段的4192902等于4192965,就是存放D盘分区链表记录的扇区地址。
依此类推,就可把硬盘上所有逻辑驱动器的分区链表扇区地址,以及分区引导记录扇区地址找出来。在以后有关编程的章节中,这是很重要的核心内容。分区表项二:(位移lceH至lddH,编号463到478)
第二个分区表项记录的是下一分区的有关参数
将16个字节按表21的格式分为八段,与第一个分区表项相同的字段就不重复说明了。在这个表项中,第三段的数据对于编程非常重要,它记录了下一个分区起始柱面地址和扇区地址。根据前面对第六段数据的计算方法,可以算出柱面值是261,扇区值是1。这两个值和第二段记录的磁头号构成CHS地址(261、0、1),作为使用基本INTl3H中断调用对下一个逻辑驱动器寻址的依据
由于两个字节不是独立使用的,需将一个字节的高2位与另一字节合并使用,所以使编程中的数据处理很麻烦。笔者在这里介绍一种简便算法:将第三段的第一个字节减1后左移两位,再加上第二个字节的值,就是柱面值。具体算式是(4H-1)×x2×2+05H第三段第一个字节(编号是465H)的值,还可以用来判断下一个逻辑驱动器是否是硬盘上的最后一个。因为在CHS寻址方式中,扇区不可能为0。只有在硬盘最后一个逻辑驱器上,因为没有第二个分区表项,所以该字节为0对分区表数据的解读和处理,是进行物理扇区读写编程的重点内容。为了加深印象,根据上面计算出的CHS地址,用 DEBUG将D盘的分区链表记录读出来,扇区地址是261柱面0磁头1扇区在这个扇区里,只有两个分区表项和结束标志55AA,其他字节全为0。按照这种规律找下去,就能把笔者硬盘的C、D、E、F四个盘的分区表链找出来,但G盘不能用这种方法找。因为CHS扇区寻址只能适用于84GB以下的硬盘,超过84GB的硬盘采用扇区线性寻址方式,必须使用扩展IT3H中断调用。详细内容在以后的章节中介绍
23分区引导记录
硬盘的主引导记录只有一个,存储在硬盘起始的第一个扇区。而硬盘的分区引导记录不止一个,每一个逻辑驱动器都有一个分区引导记录。如笔者的硬盘分为C、D、E、F、G五个逻辑驱动器,就应该有五个分区引导记录,分别存储在逻辑驱动器的第一个扇区分区引导记录主要由四部分组成:
(1)BIOS参数记录块BPB(BIOs Parameter block)。
(2)磁盘标志记录表
(3)分区引导记录代码区。
(4)结束标志55AA与本书编程内容密切相关的是第1和第4部分,第2和第3部分与本书内容无关,不进行讨论。
BIOS参数记录块BPB(今后简称作BPB表)所记录的有关参数,能帮助编程者确定磁盘的容量大小、文件分配表FAT的位置和大小、文件目录表FDT的位置和大小结束标志55AA是对扇区进行搜索,用于寻找分区引导记录所在扇区地址的依据确定分区引导记录所在扇区的地址有两种方法。一种方法是对于84GB以下的硬盘,可以使用前面已经找到的分区表所在扇区的CHS地址,“C”和“S"”保持不变,“H”加1即可。如C盘的分区表扇区地址是0柱面0磁头1扇区,可得到分区引导记录扇区地址是0柱面1磁头1扇区。再如D盘的分区表扇区地址是261柱面0磁头1扇区,可得到分区引导记录扇区地址是261柱面1磁头1扇区。另一种方法是对于84GB以上的硬盘,CHS寻址方式已不适用,必须使用线性寻址方式,前面在分析C盘分区表第一表项的第七、第八段时简要介绍过,在以后的有关章节中还要进行详细分析BPB表的结构与使用的分区格式有关,本书讨论FAT16和FAT32两种分区格式的BPB表结构
231FAT16分区格式的BPB表
FAT16分区格式BPB表从扇区字节位移0bH开始,用字节编号计算,就是第12个字节
将25个字节按表22的格式分为十二段,分别进行说明第一段是1个字,它的值为200H,等于512,说明每个扇区有512个字节第二段是1个字节,值等于64,说明每个簇包含64个扇区,则每个簇的字节数是:
64×512=32768。关于簇的概念,在后面有关章节中再作介绍。
本段参数是以后编程中需要使用的一个重要数据。在“应用篇”里将要介绍如何从不能启动的硬盘上,利用物理扇区读写技术恢复数据。而硬盘上的数据是按簇存放的,必须知道每簇的扇区数,才能在编程或运行程序时设定相关变量的值第三段是1个字,值为1,说明有1个保留扇区。第四段是1个字节,值为2,说明有2个FAT表第五段是1个字,值为512,说明有512个根目录登记项数。因为每个根目录登记项用32个字节,据此可算出FDT表总共占用32个扇区第六段是1个字,在硬盘中设为0。
第七段是1个字节,固定为8H第八段是1个字,值为256,说明每个FAT表占用256个扇区。这个数据也在编程时用于设定相关变量的值。
第九段是1个字,值为63,说明每个磁道划分成63个扇区第十
1个字,值为255,说明磁头数最大是255,这个数值的含义需要进一步解释这个参数并不是硬盘的物理磁头数,它是BOS磁盘服务程序为了管理大容量硬盘,采用位移变换后形成的值。在CHS扇区寻址方式中,柱面用10位二进制数表示,其最大值为1024现代硬盘的柱面数一般都超过了1024,因此BOS磁盘服务程序采用了减少柱面数,增加磁头数的移位算法举例说明一卜,假如一个硬盘有8192个柱面和16个磁头。很明显在CHS寻址方式中无法表示全部柱面数。这时由BIOS磁盘服务程序将柱面数换算成8192÷8=1024,将磁头数换算成16×8=128。这样既保证硬盘的容量不变,又能使操作系统或应用程序访问到所有的硬盘扇区
第十一段是1个双字,值为63,说明有63个隐藏扇区第十二段是1个双字,值为4192902,这是逻辑驱动器的总扇区数,但它不包含第十段中的隐藏扇区数。
232FAT32分区格式的BPB表
FAT32分区格式BPB表也从扇区字节位移0bH开始,占用53个字节。因为FAT16分区格式中的有些磁盘参数在FAT32格式中已不适用,必须进行扩充。具体做法是将原来的25个字节仍然保留,能适用的数据项继续使用,需要扩充的数据项移到后面的28个字节里去。日前这28个字节只使用了很少一部分,剩下的字节全为0,供系统今后继续扩充时
下面将FAT32分区格式的G盘引导记录读出来,结合表2-3进行分析因为 DEBUG程序只能调用基本IT3H中断,不能调用扩展IT13H中断,所以前面读扇区的方法已不适用。现在使用“工具篇”里介绍的 RSECTOR.EXE程序将该扇区内容读出来,现在先给出结果,关于工具程序 RSECTOR.EXE的详细内容和操作方法可参阅后面有关章节