1、关键词:MBS- Master Boot Sector 主引导扇区MBRMaster Boot Record 主引导记录DPTDisk Partition Table 硬盘分区表BRIBoot Record ID 引导记录标志CHS(Cylinder柱面,也就是磁道 编号0m Head 头,编号0-n Sector 扇区 编号1-t)参数。一、 硬盘结构和逻辑编号(1)硬盘物理结构传统硬盘由多个双面磁碟组成,每个面都有一个读写磁头,磁头编号从0开始,所谓0面就是指0磁头所对应的面;每个面被划为若干磁道,编号从负数开始,磁道数越小,越靠近磁碟边缘,因为线速度越大,所以读写速度也越快;用户只能使用
2、0道以后的磁道,负磁道为硬盘所带的微处理器使用的一些代码(Fireware)和本硬盘一些重要参数存放的地方;每个磁道又分为若干扇区(每个磁道扇区数量都一样),扇区的编号从1开始(不是从0开始哟!),每个扇区存放536(这个数记不清楚了,呵呵)多个字节,但共用户使用的只有512个字节,剩下的作为校验(CRC)和其它用途。这就是著名的硬盘寻址CHS(Cylinder柱面,也就是磁道 编号0m Head 头,编号0-n Sector 扇区 编号1-t)参数。对于CHS中参数中Cylinder柱,也就是磁道,用10个二进制数表示,所以最大为1024Head 头,用一个字节表示,最大为256个磁头Sec
3、tor 扇区,用6为二进制数表示,所以最大为 641(不能用0呀)63所以使用CHS表示的硬盘最大容量为1024X256X63X5128455716864字节8064M容量,这就是8G容量的由来。明显看出,外道比内道长,被划分为同样扇区数是非常浪费的。现代磁盘基本上也只有2个左右的磁碟,4个面左右,每个磁道上的扇区数量都不相同,一般使用LBA表示方法来表示每个扇区,所谓LBA指每个扇区都有一个编号,从0开始(负编号不给用户使用),为了与CHS方式兼容,硬盘内部代码使用了一种CHS-LBA映射的方式。(2)硬盘逻辑编号当一台计算机挂多个IDE硬盘时,LinuxUnix对硬盘的编号最为科学。它是这
4、样处理的hda第一个IDE口主硬盘,hdb第一个IDE口从硬盘,hdc第二个IDE口主硬盘,hdd第二个IDE口从硬盘,但对于BIOS,DOS和Windows,处理方式有点不一样,只要掌握下面原则就可以了(1) 上面4硬盘是连续编号,从小到大,光驱不算(2) 作为启动的硬盘编号最小,为0x80(16进制数)如第一个IDE口,主挂硬盘,从挂光驱,第二个ide口挂2个硬盘,BIOS设置从第二个主硬盘启动,则它们的编号为:第二个IDE主硬盘为0x80,第一个IDE主硬盘为0x81,第二个IDE从硬盘为0x82又如第一个IDE口主空,从挂硬盘,第二个IDE口主挂光驱,从挂硬盘,BIOS设置从第一个从硬
5、盘启动,则它们的编号为:第一个IDE从硬盘为0x80,第二个IDE从硬盘为0x81二、 硬盘分区规范和制作多重启动程序的方法所谓对硬盘分区,直观意义上理解,是逻辑上把硬盘分为几个块。本来就象西瓜一样,你爱怎么切就怎么切,如在CHS参数方式下,你完全可以把0面全部扇区当成一个区。为了能保证各个操作系统的一致,所以制定了一个硬盘分区规范,如果你不按这个规范做,硬盘肯定只能被你自己开发的操作系统使用。这个规范规定:(1) CHS参数中0面0道1扇区为硬盘分区信息和引导代码扇区(Master Boot Sector MBS),也就是LBA=0的扇区;(2) 分区是按空心圆柱形(蛋卷形状)划分,如图所示
6、由于0面0道1扇区(MBS)保存启动代码和硬盘分区信息,如果这个扇区物理损坏,这个硬盘也就无法进行分区,导致硬盘无法使用。但是对于现代硬盘,由于它内部使用的是映射机制,完全可以把个好的扇区映射过来,修复硬盘。很多硬盘修复软件可以做到这点,比较有名的是MHDD和PC3000对于这个重要扇区(512个字节)的规范为:MBRMaster Boot Record,主引导记录,共446个字节。规范并没有规定代码是什么,很多软件公司都有自己的MBR,如MS的MBR,Linux的Grub或Lilo,DM的等。我们常用的DOS下的Fdisk mbr其实就是使用MS的MBR覆盖这446个字节,Fdisk程序内部
7、本身包含这段代码,有兴趣可以把Fdisk.EXE改名为Fdisk.Txt,再用记事本打开,可以看到如下信息Invalid partition table.Error loading operating system.Missing operating system。MS的这段代码的功能是查找引导分区信息或者叫活动分区(在MBR后面),如果没有或为2个以上,则显示以上信息,系统引导失败;否则再按引导分区项读对应引导扇区,判断结尾是否为55AA,是的话把CPU的控制权交给引导扇区对应的代码;否则引导失败。当然我们也可以编写自己的MBR,做多重启动,这个大家先反汇编MS的MBR,认真研究以后就不难了
8、,呵呵。对于这个MBR,MS非常霸道,如果你安装了Linux的Grub,你就别想在这个硬盘上安装Windows,这个问题在TPY BBS里面出现过多次(本人也回答过多次,对于一些人动不动就叫别人对硬盘低级格式化的做法有点反感),最快的解决方法是:Fdisk mbr,当然如果你的硬盘东西都不要的话,可以往MBS里面写一堆垃圾,破坏后面要说的BRI,让Windows安装程序认为MBS非法,然后在安装程序里面重新分区就可以了DPTDisk Partition Table 硬盘分区表,这是硬盘最重要的信息,这种信息被破坏,也就不知道硬盘是怎么分区的了,不过现在有些软件通过搜索可以找回分区信息,如eas
9、yrecovery.DPT共64个字节,分为4项,每项16个字节对应一个分区。分区规范规定:一个硬盘可以有多个主分区(Primary Partition),但最多只能有一个扩展分区(Extended Partition),一个扩展分区可以划分为多个逻辑分区,所以一个硬盘最多只能划为4个主分区或者3个主分区一个扩展分区。MS真懒,它的OS最多只让我们划一个主分区一个扩展分区,其它OS没这个问题。每个分区项的结构如下:偏移 内容 大小00h 0x80表示活动分区,00不活动 1BYTE,由于这个字节为MBR代码所识别,我们完全可以编写自己的MBR,不理会该字节内容,启动时选择所要启动的分区。甚至设
10、置全部的分区为活动分区都可以。无论为怎么样填写,作为从盘,都能被操作系统所识别01h 分区开始磁头编号(面号) 1BYTE02h低6位 分区开始扇区号 6位二进制数02h高2位和03h 分区开始的柱面数,也叫道编号 10位二进制数04h 分区类型 1Byte,标识这个分区的类型,如果我们把这个直接内容修改了,会使得操作系统不能认出这个分区,间接保护了这个分区的资料,当然我们也可以往MBS写一堆垃圾来保护整个硬盘资料,当我们自己要用时,就恢复MBS05h 分区结束磁头编号 1Byte06h 分区结束的柱面和扇区,结构同上 2byte08h 该分区第一扇区到MBS的总扇区数量 4Byte0Ch 该
11、分区的总扇区数量 4Byte分区类型:00h 未知类型或不用01h 12bit Fat04h 16bit fat05h 扩展MS_DOS分区0Bh Fat32 容量最大2G0Ch Fat32 ,采用LBA模式,调用int13h扩展中断0Fh 扩展MS_DOS分区,Fat32 ,采用LBA模式,调用int13h扩展中断07h NTFS82h Linux83h Linux SwapBRIBoot Record ID 引导记录标志 接在DPT后面的最后2个字节为 55 AA,表示这个扇区是个正常的计算机启动时,BIOS把这个扇区读入内存,发现BRI不是55 AA,则会拒绝启动。如下面一个MBS内容0
12、FA20200 33 C0 8E D0 BC 00 7C FB-50 07 50 1F FC BE 1B 7C 3.P.P.0FA20210 BF 1B 06 50 57 B9 E5 01-F3 A4 CB BE BE 07 B1 04 .PW.0FA20220 38 2C 7C 09 75 15 83 C6-10 E2 F5 CD 18 8B 14 8B 8,.u.0FA20230 EE 83 C6 10 49 74 16 38-2C 74 F6 BE 10 07 4E AC .It.8,t.N.0FA20240 3C 00 74 FA BB 07 00 B4-0E CD 10 EB F2
13、89 46 25 .t.F%0FA20250 96 8A 46 04 B4 06 3C 0E-74 11 B4 0B 3C 0C 74 05 .F.t.t.0FA20260 3A C4 75 2B 40 C6 46 25-06 75 24 BB AA 55 50 B4 .u+.F%.u$.UP.0FA20270 41 CD 13 58 72 16 81 FB-55 AA 75 10 F6 C1 01 74 A.Xr.U.u.t0FA20280 0B 8A E0 88 56 24 C7 06-A1 06 EB 1E 88 66 04 BF .V$.f.0FA20290 0A 00 B8 01 0
14、2 8B DC 33-C9 83 FF 05 7F 03 8B 4E .3.N0FA202A0 25 03 4E 02 CD 13 72 29-BE 46 07 81 3E FE 7D 55 %.N.r).F.U0FA202B0 AA 74 5A 83 EF 05 7F DA-85 F6 75 83 BE 27 07 EB .tZ.u.0FA202C0 8A 98 91 52 99 03 46 08-13 56 0A E8 12 00 5A EB .R.F.V.Z.0FA202D0 D5 4F 74 E4 33 C0 CD 13-EB B8 00 00 80 58 30 17 .Ot.3.X0
15、.0FA202E0 56 33 F6 56 56 52 50 06-53 51 BE 10 00 56 8B F4 V3.VVRP.SQ.V.0FA202F0 50 52 B8 00 42 8A 56 24-CD 13 5A 58 8D 64 10 72 PR.B.V$.ZX.d.r0FA20300 0A 40 75 01 42 80 C7 02-E2 F7 F8 5E C3 EB 74 49 .u.B.tI0FA20310 6E 76 61 6C 69 64 20 70-61 72 74 69 74 69 6F 6E nvalid partition0FA20320 20 74 61 62
16、6C 65 00 45-72 72 6F 72 20 6C 6F 61 table.Error loa0FA20330 64 69 6E 67 20 6F 70 65-72 61 74 69 6E 67 20 73 ding operating s0FA20340 79 73 74 65 6D 00 4D 69-73 73 69 6E 67 20 6F 70 ystem.Missing op0FA20350 65 72 61 74 69 6E 67 20-73 79 73 74 65 6D 00 00 erating system.0FA20360 00 00 00 00 00 00 00 0
17、0-00 00 00 00 00 00 00 00 .0FA20370 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 .0FA20380 00 00 00 8B FC 1E 57 8B-F5 CB 00 00 00 00 00 00 .W.0FA20390 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 .0FA203A0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 .0FA203B0 00 00 00 00 00 00 00 00-00 00
18、00 00 00 00 以上是MBR 80 01 .0FA203C0 01 00 0B FE 7F 7E 3F 00-00 00 80 E2 5D 00 00 00 .0FA203D0 41 7F 05 FE FF 0F BF E2-5D 00 51 4C 62 00 00 00 A.QLb.0FA203E0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 .0FA203F0 00 00 00 00 00 00 00 00-00 00 00 00 00 00以上是DPT 55 AA .U.最后这个是BRI了,呵呵共2个分区,一个主分区(分区类型为
19、0B)一个扩展分区(分区类型为05)第一个分区信息80 01 01 00 0B FE 7F 7E 3F 00-00 00 80 E2 5D 0080这是一个活动分区01分区起始磁头号为1,也就是0头0道除了MBS使用一个扇区以外其它没有使用,我们可以在那里保存MBS内容(备份呀),也可以放代码,因为446个字节也许不够我们用,呵呵01 00 0000001 00000000,分区开始扇区数为000001=1,开始磁道数为0000000000=00B- Fat32主分区FE分区结束磁头数FE= 254,可以看出在CHS模式下,该硬盘有255个磁头7F 7E0111 1111 0111 1110,
20、分区结束扇区数11 1111(b)63分区结束磁道数01 0111 11103823F 00-00 00分区前面的扇区数为0000003F=63,刚好是0道所占的扇区数80 E2 5D 00分区的总扇区数为005DE280=6152832, 6152832X512(1024X1024)= 3004.3125M=3G,完全正确!三、 使用BIOS直接对硬盘操作方法(1) BIOS中断int 13BIOS已经为我们准备了读写磁盘的代码,这就是Int 13(13h号中断),但很多操作系统在启动完成后都不使用这些代码,而使用扩展的LBA访问模式(驱动程序所带的代码),以突破8G容量的限制和实现DMA访
21、问模式。另外在Winnt以上版本OS,由于MBS是重要的信息区,系统禁止用户对MBS进行读写操作,全部的防病毒软件也对该扇区进行了保护。所以只有DOS和Win 9X才能使用int 13h访问MBS调用int 13h的入口参数为ah=2 读磁盘 3 写磁盘入口参数:AH=功能号,02为读盘操作;03为写磁盘;AL=一次读取的扇区数; ESBX=读入内存的起始地址 CH=10位柱面号的低8位;CL:高两位是10位柱面号的高两位,低6位是扇区号 DH=磁头号;DL=驱动器号,00代表第一个软驱;对于硬盘是硬盘编号,0x80为第一个硬盘,也就是系统启动的硬盘(2) Debug使用方法在DOS的DEBU
22、G程序里面,我们可以编写简单的汇编程序,如使用A命令则是输入代码,使用U命令是反汇编,具体大家可以查找相应的教材,也可以使用命令得到帮助,如注在DEBUG里面,所有数据全部为16进制数CWINDOWSdebug-(注获取帮助)assemble A addresscompare C range addressdump D rangeenter E address fill F range listgo G =address addresseshex H value1 value2input I portload L address drive firstsector numbermove M r
23、ange addressname N pathname arglistoutput O port byteproceed P =address numberquit Qregister R registersearch S range listtrace T =address valueunassemble U rangewrite W address drive firstsector numberallocate expanded memory XA #pagesdeallocate expanded memory XD handlemap expanded memory pages XM
24、 Lpage Ppage handledisplay expanded memory status XS-a100(注从100开始汇编代码)0FA20100 mov ax,201(注ah2,读磁盘,al=1读一个扇区,如果是写一个扇区,就改为mov ax,301)0FA20103 mov bx,200 (注内容放在200处)0FA20106 mov cx,1 (注ch0,cl=1,0面1扇区)0FA20109 mov dx,80 (注dh0,0道,dl=80 第一个硬盘,即启动硬盘)0FA2010C int 13 (注 执行磁盘操作代码)0FA2010E int 20 (注:程序结束)0FA2
25、0110-u100(注反汇编)0FA20100 B80102 MOV AX,02010FA20103 BB0002 MOV BX,02000FA20106 B90100 MOV CX,00010FA20109 BA8000 MOV DX,00800FA2010C CD13 INT 130FA2010E CD20 INT 200FA20110 0283470D ADD AL,BP+DI+0D470FA20114 02806F0A ADD AL,BX+SI+0A6F0FA20118 2480 AND AL,800FA2011A 47 INC DI0FA2011B 0A34 OR DH,SI0FA2011D 00910F83 ADD BX+DI+830F,DL-g(注运行)Program terminated normally-d200 (显示读出来的结果,MBS)-d0FA202B0 AA 74 5A 83 EF 05 7F DA-85 F6 75 83
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1