我可以: 邀请好友来看>>
ZOL论坛 > 硬件论坛 > 硬盘论坛 > 硬盘的读取与修复
帖子很冷清,卤煮很失落!求安慰
返回列表
签到
手机签到经验翻倍!
快来扫一扫!

硬盘的读取与修复

278浏览 / 0回复

云起云落间

云起云落间

0
精华
19
帖子

等  级:Lv.8
经  验:45094
  • Z金豆: 0

    千万礼品等你来兑哦~快点击这里兑换吧~

  • 城  市:河北
  • 注  册:2004-11-17
  • 登  录:2022-12-12
发表于 2006-03-02 13:40:01
电梯直达 确定
楼主
寒雨轩^0^漫雨把此帖设为精华,作者得到1000可用分50分专家分:)

硬盘零磁道的读取与修复

一、硬盘的物理结构

       硬盘的硬件组成主要有两大部分:

(1)       磁头-盘片组件HADHEAD DISK ASSEMBLY),其中包括读写磁头、磁头驱动机构、磁盘片、盘片电动机等。

(2)       印制电路板组件PCBAPRINTED CIRCUIT BOARD ASSEMBL),其中包括电阻、电容、半导体集成电路等元器件,负责对各种信号进行处理。

硬盘是依靠磁盘片上的磁性介质记录信息的,对盘片表面的磁介质必须进行某些有序的磁化处理,使这磁介质能够符合进行数据存取的要求。对磁介质的处理分三个过程,就是通常所说的低级格式化、分区和高级格式化。

(一)低级格式化

对于一块新硬盘,这个过程已经由生产厂家在产品出厂前完成了。低级格式化对磁介质的读写功能有一定影响,所以使用者一般不要进行该项操作。除非你的硬盘出现了坏道,不得不进行低格操作。

低级格式化的目的是将盘面划分成磁道、扇区和柱面。

下面简单介绍一下磁盘的各个组成部分。

1、 磁道

硬盘加电正常工作以后,磁盘片由主轴电机带动高速旋转。当磁头停在一个位置时,盘片旋转一周,磁头就在盘片表面画出一个圆形轨迹,这个圆形轨迹称为磁道。磁道从盘片外缘开始编号,起始号为0

2、 扇区

磁盘上的每个磁道被划分成许多弧段,弧段之间有间隔,这些弧段称为扇区。扇区也有编号,起始号为1。每个磁道分成63个扇区,每个扇区可存储的数据是512个字节。实际上现在的大容量硬盘,为了提高磁介质的存储利用率,使用了等密度的存储方式,也就是说外圈磁道的扇区数比内圈磁道多。为了与老的制式兼容,由硬盘控制器的驱动程序将参数进行转换。

3、 柱面

硬盘一般由多张重叠的盘片组成,每个盘面都被划分成数目相等的磁道。具有相同的编号的磁道形成了一个圆柱,这就是硬盘的柱面。柱面的编号和磁道编号相同。

4、 磁头

一张磁盘有两个盘面,每个盘面都有一个读写磁头。将盘面进行编号,起始号为0,磁头的编号和盘面的编号相同。

(二)分区

硬盘在使用时,是按照不同的区域存储数据的,硬盘分区就是划分区域的过程。划分好的每一个区域都称作一个分区。这项工作由分区程序来完成,通常使用FDISK。

在分区的过程中,分区程序向0柱面0磁头1扇区写入主引导记录MBR(MASTER BOOT RECORD)和分区表记录DPT(DISK PARTITION TABLE),并建立一个分区表链,向所有的逻辑驱动器写入链表记录。

硬盘的分区格式有很多种,选用什么样的分区格式是由选用哪一个操作系统所决定的。以目前流行的操作系统来说,常用的分区格式有四种,分别是FAT16,FAT32,NTFS,和EXT2。其中使用最多的是FAT16和FAT32。

(三)高级格式化

硬盘分区以后还不能直接使用,要在每个分区内建立起完整的存储系统才能正常使用。建立存储系统的工作由FORMAT程序来完成,这个过程称作高级格式化。高级格式化的目的是在分区内建立分区引导记录DBR(DOS BOOT RECORD)、文件分配表FAT(FILE ALlocetion TABLE)、文件目录表FDT(FILE DIRECTORY TABLE)和数据区DATA。

二、硬盘的数据结构

硬盘只有建立起完整的数据结构,才能正常使用。数据结构由六部分组成,分别是主引导记录、主分区表和分区表链、分区引导记录、文件表、文件目录表以及数据区。而主引导记录、主分区表和分区表链都在零磁道,而分区引导记录、文件表、文件目录表以及数据区不在零磁道,在此我们不做讨论。

读取扇区数据已经完全不用考虑被操作的硬盘安装的是什么操作系统,甚至不用考虑硬盘上还有没有操作系统。因为这种方法,是调用BIOS磁盘服务程序来完成的,而BIOS对硬盘的管理级别高于所有的操作系统。但是这种操作必须了解有关的数据结构的文件的存储方式。

(一)主引导记录

硬盘的主引导记录也称MBR,位于0柱面0磁头1扇区。该扇区的512个字节有三部分内容,除了主引导记录外,还有分区表和结束标志55 AA。

通常情况下,一块硬盘上只有一个主引导记录。

主引导记录的作用非常重要,它是硬盘启动时最先加载的数据。

主引导记录扇区所在的磁道,通常被称为0磁道,它属于隐藏磁道,这个磁道的63个扇区属于隐藏扇区。操作系统的所有命令,除了FDISK以外都不能访问它们。就来格式化程序FORMAT,对它们也无能为力。

正因为如此,0磁道的63个扇区就成了一些病毒程序代码、操作系统的引导代码、应用软件用于自我保护的识别标记、BIOS扩展程序代码的栖息之地。

所有对INT13H中断的调用都应在DOS实模式下运行,因为WINDOWS95以上的操作系统都是保护模式,为了将程序的编译和运行环境统一起来,本文所有的程序的运行环境为DOS模式,本文所用到的程序在均在DOS下调试并通过。

1、读扇区C程序(程序1)

#include                           //1.

#include                            //2.

void main()                                //3.

{                                        //4.

   FILE *fp;                              //5.

   char h[512];                            //6.存放扇区数据

   char sh[13];                            //7.存放文件名

   int i,j;                                 //8.

   int cyl=0,head=0,sector=1;                //9.柱面,磁头,扇区编号

   printf("Enter file name: ");                //10.

   scanf("%s",sh);                         //11.输入文件名

   fp=fopen(sh,"wb+");                     //12.打开文件

   biosdisk(0x02,0x80,head,cyl,sector,1,h);     //13.调用函数将扇区数据读入数组

   for(i=0;i<=511;i++)                      //14.将数据输出到文件

     fputc(h,fp);                         //15.

   rewind(fp);                             //16.文件指针回到开头

   for(i=1;i<=512;i++)                      //17.

   {                                     //18.

     j=fgetc(fp);                           //19.取字符

     printf("%2x",j);                        //20.16进制显示

     if(i%32==0)                           //21.每显示32字节换行

       printf("n");                         //22.

   }                                      //23.

   fclose(fp);                              //24.关闭文件

   printf("n");                             //25.

}                                        //26.

2、源程序解释

2行将头文件bios.h包含进来。函数biosdisk()的原型是在头文件bios.h里定义的,所以在程序中必须用#include语句将头文件包含进来。

12行用“wb+”的方式打开文件,文件名存放在数组sh里。“wb+”方式指定文件以二进制方式打开既可以读出数据,也可以写入数据;运行程序时若文件已存在,则文件的内容被破坏;若文件不存在,则建立文件。

13行调用函数biosdisk()读取扇区数据。下面给出biosdisk()函数的调用格式:

int biosdisk(int cmd,int drive,int head,int track,int sector,int nsects,void *buffer);

参数cmd表示对磁盘进行何种操作。其中2表示将扇区内容读到缓冲区buffer;     3表示将缓冲区buffer中的内容写入扇区。其它与本文无关。

参数drive表示驱动器号,0x80表示第一硬盘,0x81表示第二硬盘。

参数head表示磁头号。

参数track表示磁道号,这是的磁道号在CHS(柱面数,磁头数,每磁道扇区数)寻址方式中就是柱面号。

参数sector表示扇区号。

参数nsects表示操作的扇区数,如果设置两个以上扇区,这些扇区必须是连续的。

参数buffer表示缓冲区地址指针。

14、15行用一个循环将512个字符输入到文件。

16行调用函数rewind()将文件指针返回到开头。

17-24行将存入文件的扇区数据按16进制方式打印到屏幕。

3、程序的运行结果(结果1)

由于二进制文件在WINDOWS里不能用普通的软件打开,下面所看到的结果是用WinHex 11.2 SR-1打开的。

Offset      0  1  2  3  4  5  6  7   8  9 10 11 12 13 14 15

 

00000000   33 C0 8E D0 BC 00 7C FB  50 07 50 1F FC BE 1B 7C   3缼屑.|鸓.P..|

00000016   BF 1B 06 50 57 B9 E5 01  F3 A4 CB BD BE 07 B1 04   ?.PW瑰.螭私??

00000032   38 6E 00 7C 09 75 13 83  C5 10 E2 F4 CD 18 8B F5   8n.|.u.兣.怍?嬽

00000048   83 C6 10 49 74 19 38 2C  74 F6 A0 B5 07 B4 07 8B   兤.It.8,t鰻???

00000064   F0 AC 3C 00 74 FC BB 07  00 B4 0E CD 10 EB F2 88   瓞<.t..??腧?

00000080   4E 10 E8 46 00 73 2A FE  46 10 80 7E 04 0B 74 0B   N.鐵.s*﨔.~..t.

00000096   80 7E 04 0C 74 05 A0 B6  07 75 D2 80 46 02 06 83   ~..t.牰.u襽F..?

00000112   46 08 06 83 56 0A 00 E8  21 00 73 05 A0 B6 07 EB   F..僔..?.s.牰.?

00000128   BC 81 3E FE 7D 55 AA 74  0B 80 7E 10 00 74 C8 A0   紒>䙌U猼.~..t葼

00000144   B7 07 EB A9 8B FC 1E 57  8B F5 CB BF 05 00 8A 56   ?氅孅.W嬽丝..奦

00000160   00 B4 08 CD 13 72 23 8A  C1 24 3F 98 8A DE 8A FC   .??r#娏$?槉迠?

00000176   43 F7 E3 8B D1 86 D6 B1  06 D2 EE 42 F7 E2 39 56   C縻嬔喼?翌B麾9V

00000192   0A 77 23 72 05 39 46 08  73 1C B8 01 02 BB 00 7C   .w#r.9F.s.?.?|

00000208   8B 4E 02 8B 56 00 CD 13  73 51 4F 74 4E 32 E4 8A   婲.媀.?sQOtN2鋳

00000224   56 00 CD 13 EB E4 8A 56  00 60 BB AA 55 B4 41 CD   V.?脘奦.`华U碅?

00000240   13 72 36 81 FB 55 AA 75  30 F6 C1 01 74 2B 61 60   .r6侞U猽0隽.t+a`

00000256   6A 00 6A 00 FF 76 0A FF  76 08 6A 00 68 00 7C 6A   j.j.v.v.j.h.|j

00000272   01 6A 10 B4 42 8B F4 CD  13 61 61 73 0E 4F 74 0B   .j.碆嬼?aas.Ot.

00000288   32 E4 8A 56 00 CD 13 EB  D6 61 F9 C3 49 6E 76 61   2鋳V.?胫aInva

00000304   6C 69 64 20 70 61 72 74  69 74 69 6F 6E 20 74 61   lid partition ta

00000320   62 6C 65 00 45 72 72 6F  72 20 6C 6F 61 64 69 6E   ble.Error loadin

00000336   67 20 6F 70 65 72 61 74  69 6E 67 20 73 79 73 74   g operating syst

00000352   65 6D 00 4D 69 73 73 69  6E 67 20 6F 70 65 72 61   em.Missing opera

00000368   74 69 6E 67 20 73 79 73  74 65 6D 00 00 00 00 00   ting system.....

00000384   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................

00000400   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................

00000416   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................

00000432   00 00 00 00 00 2C 44 63  C1 81 C1 81 00 00 80 01   .....,Dc羴羴...

00000448   01 00 06 FE 3F 0C 3F 00  00 00 8E 2F 03 00 00 00   ...?.?...?....

00000464   01 0D 0B FE FF 24 CD 2F  03 00 18 25 C2 00 00 00   ...?$?...%?..

00000480   C1 25 0F FE FF FF E5 54  C5 00 DC 8F 8B 08 00 00   ?.?錞?軓?..

00000496   00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 AA   ..............U

4、对程序的运行结果(结果1)的分析与说明

1、从第0个到第445个字节就是引导记录。

2、从第446到509是分区表我们一会再讨论。

3、最后两个字节结束标志55 AA。因为两个字节组成一个字,存入硬盘的顺序是字节在前,高字节在后,所以55 AA写成十六进制就为AA 55H。

结束标志55 AA是查找系统数据扇区的标志,据此对扇区进行搜索,可用于寻找主引导记录、主分区表或分区链表所在的扇区地址。

(二)分区表

分区表占用0柱面0磁头扇区的64个字节,从446到509。它共有四个分区表项,每个分区表项占16字节。一般只使用两个表项,另外两个表项全为0。(在结果1中有三个不为0的分区表项,原因我为了调试程序的方便在C盘用PowerQuest PartitionMagic Pro 7.2 分出来一个100M的新的C盘安装了MS-DOS的原因。因此我们不对第三个分区表项进行讨论)

分区表项的格式如下表所示

1

高级模式
论坛精选大家都在看24小时热帖7天热帖大家都在问最新回答

针对ZOL论坛您有任何使用问题和建议 您可以 联系论坛管理员查看帮助  或  给我提意见

快捷回复 APP下载 返回列表