Mbr(master boor record)主引导记录区。它与操作系统无关,它处在0柱面,0磁道,1扇区。没有扇区的大小一般是512 bytes。在fat文件系统中的实现代码为了达到最大的兼容,一般采用扇区大小为512,尽管windows支持其他的扇区长度。在这个扇区中前446 bytes是引导代码。后面64 bytes是磁盘的分区信息。最后两个bytes是结束标志。0x55aa。
前446个bytes的引导代码对用户来说一般不会有什么用处,但是64bytes的分区信息是有用的。这也是病毒经常破坏的地方。如果这里被破坏那么就不能正确地获得,分区的信息,更不能正确地读取分区上的数据内容。我们以分区表的一个表项来举例:下面是我用磁盘工具察看的u盘的第一个扇区:
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00000000 FA 33 C 0 8E D0 BC 00 7C 8B F4 50 07 50 1F FB FC ?缼屑.|嬼P.P.
00000010 BF 00 06 B9 00 01 F 2 A 5 EA 1D 06 00 00 BE BE 07 ?.?.颔?...揪.
00000020 B3 04 80 3C 80 74 0E 80 3C 00 75 1C 83 C 6 10 FE ?€<€t.€<.u.兤.?
00000030 CB 75 EF CD 18 8B 14 8B 4C 02 8B EE 83 C 6 10 FE 藆锿.?婰.嬵兤.?
00000040 CB 74 1A 80 3C 00 74 F 4 BE 8B 06 AC 3C 00 74 0B 藅.€<.t艟??.t.
00000050 56 BB 07 00 B4 0E CD 10 5E EB F0 EB FE BF 05 00 V?.??^腽膻?.
00000060 BB 00 7C B8 01 02 57 CD 13 5F 73 0C 33 C 0 CD 13 ?|?.W?_s.3劳.
00000070 4F 75 ED BE A3 06 EB D3 BE C2 06 BF FE 7D 81 3D Ou砭?胗韭.傀}?
00000080 55 AA 75 C 7 8B F5 EA 00 7C 00 00 49 6E 76 61 6C U猽菋蹶.|..Inval
00000090 69 64 20 70 61 72 74 69 74 69 6F 6E 20 74 61 62 id partition tab
000000A 0 6C 65 00 45 72 72 6F 72 20 6C 6F 61 64 69 6E 67 le.Error loading
000000B0 20 6F 70 65 72 61 74 69 6E 67 20 73 79 73 74 65 operating syste
000000C 0 6D 00 4D 69 73 73 69 6E 67 20 6F 70 65 72 61 74 m .Missing operat
000000D0 69 6E 67 20 73 79 73 74 65 6D 00 00 00 00 00 00 ing system......
000000E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000000F 0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000001A 0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000001B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 01 ..............€.
000001C 0 01 00 0B 0F E0 FF 20 00 00 00 E0 E4 07 00 00 00 ....? ...噤....
000001D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000001E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000001F 0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA ..............U
从0x1be——0x1fd这个64个字节就是分区表,其中0x1be——0x1cd是一个分区,一位u盘只有一个分区,所以后面的就全是0。这些字节代表的意思如下:
第一个字节是:分区活动标志,
第二,三,四字节是本分区开始的磁头,扇区,柱面号。
第五个字节是:文件系统的类型标记。
分区类型符为:
00H——表示该分区未用
06H——FAT16基本分区
0BH——FAT32基本分区
05H——扩展分区
07H——NTFS分区
0FH——(LBA模式)扩展分区
83H—— Linux分区
第六,七,八字节是结束磁头号,扇区号,柱面号。
第九,十,十一,十二是本分区之前已经用的扇区数。
第十三,十四,十五,十六是本分区的总扇区数。
根据这些信息我们可以找到这个分区,我们注意到9,10,11,12字节是本分区之前已经用的扇区数,因为扇区编号从0开始,所以这个扇区的数也就是本分区开始的扇区号。但是还要注意计算方式,我们按照上面截取的数据来说明,第9,10,11,12字节的内容是:20 00 00 00,我们计算时要把它倒过来,也就是00 00 00 20,其实就是0x20,十进制就是32,也就是说在本分区之前已经有32个扇区被使用;那么本分区的扇区号就是32。把它转换成磁盘的地址空间,就是32*512(扇区大小为512bytes) = 0x00004000处。从这个开始的第一个扇区就是我们常说的dbr区,下面我们把此处的第一扇区的内容复制到下面:
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00004000 EB 58 90 4D 53 44 4F 53 35 2E 30 00 02 04 22 00 隭怣SDOS5.0...".
00004010 02 00 00 00 00 F 8 00 00 3F 00 FF 00 20 00 00 00 .....?.?.. ...
00004020 E0 E4 07 00 EF 03 00 00 00 00 00 00 02 00 00 00 噤..?..........
00004030 01 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00004040 00 00 29 3C 89 C 3 FC 4E 4F 20 4E 41 4D 45 20 20 ..)<壝麼O NAME
00004050 20 20 46 41 54 33 32 20 20 20 33 C 9 8E D1 BC F4 FAT32 3蓭鸭?
00004060 7B 8E C1 8E D9 BD 00 7C 88 4E 02 8A 56 40 B4 08 {幜庂?|圢.奦@?
00004070 CD 13 73 05 B9 FF FF 8A F1 66 0F B 6 C 6 40 66 0F ?s.?婑f.镀@f.
00004080 B6 D1 80 E2 3F F7 E2 86 CD C0 ED 06 41 66 0F B7 堆€?麾喭理.Af.?
00004090 C 9 66 F 7 E1 66 89 46 F 8 83 7E 16 00 75 38 83 7E 蒮麽f塅鴥~..u8儈
000040A 0 2A 00 77 32 66 8B 46 1C 66 83 C 0 0C BB 00 80 B9 *.w 2f 婩.f兝.?€?
000040B0 01 00 E8 2B 00 E9 48 03 A 0 FA 7D B4 7D 8B F 0 AC ..?.镠.狕}磢嬸?
000040C 0 84 C 0 74 17 3C FF 74 09 B4 0E BB 07 00 CD 10 EB 劺t.<t.??.??
000040D0 EE A0 FB 7D EB E 5 A 0 F 9 7D EB E0 98 CD 16 CD 19 顮鹽脲狔}豚樛.?
000040E0 66 60 66 3B 46 F 8 0F 82 4A 00 66 6A 00 66 50 06 f `f;F?侸.fj.fP.
000040F 0 53 66 68 10 00 01 00 80 7E 02 00 0F 85 20 00 B4 Sfh....€~...?.?
00004100 41 BB AA 55 8A 56 40 CD 13 0F 82 1C 00 81 FB 55 A 华U奦@?.?.侞U
00004110 AA 0F 85 14 00 F 6 C 1 01 0F 84 0D 00 FE 46 02 B4 ??.隽..?.﨔.?
00004120 42 8A 56 40 8B F4 CD 13 B 0 F 9 66 58 66 58 66 58 B奦@嬼?谤fXfXfX
00004130 66 58 EB 2A 66 33 D2 66 0F B7 4E 18 66 F 7 F 1 FE fX?f3襢.種.f黢?
00004140 C 2 8A CA 66 8B D0 66 C 1 EA 10 F 7 76 1A 86 D6 8A 聤蔲嬓f陵.鱲.喼?
00004150 56 40 8A E 8 C 0 E4 06 0A CC B8 01 02 CD 13 66 61 V@婅冷..谈..?fa
00004160 0F 82 54 FF 81 C 3 00 02 66 40 49 0F 85 71 FF C3 .俆伱..f@I.卶?
00004170 4E 54 4C 44 52 20 20 20 20 20 20 00 00 00 00 00 NTLDR .....
00004180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00004190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000041A 0 00 00 00 00 00 00 00 00 00 00 00 00 0D 0A 52 65 ..............Re
000041B0 6D 6F 76 65 20 64 69 73 6B 73 20 6F 72 20 6F 74 move disks or ot
000041C 0 68 65 72 20 6D 65 64 69 61 2E FF 0D 0A 44 69 73 her media...Dis
000041D0 6B 20 65 72 72 6F 72 FF 0D 0A 50 72 65 73 73 20 k error..Press
000041E0 61 6E 79 20 6B 65 79 20 74 6F 20 72 65 73 74 61 any key to resta
000041F 0 72 74 0D 0A 00 00 00 00 00 AC CB D8 00 00 55 AA rt.......?.U
这就是启动扇区(boot sector),其中有一个很重要的块叫做bpb(bios 参数块)。我们选择几个重要的数据进行说明,这里的重要是对我来说很重要的,我在实现fat的文件系统。首先是偏移地址11,12处00 02,它表示没一个扇区占的字节数,它的计算方法和前面的一样,就是ox200,也就是512bytes;偏移13处代表每簇多少扇区。这里是04,就是每簇包含4个扇区;偏移14,15是保留区的扇区数,这里是34个保留区,偏移16就是fat表的个数,一般这里是2,这两个fat表是一样的,为了备份数据;偏移17是根目录中项计数,对已fat32来说是0;在偏移17,18处是fat12/16的表结构占用的扇区数,对于fat32文件系统此处设置为0,在偏移36处的4个字节是fat32的一个fat表结构占用的扇区数,需要注意的是这个地方不能同时被设置。因为我的文件系统是fat32,我们只关心偏移36处的4个字节,经计算我们得出一个fat表占用1007个扇区。Fat区紧贴着保留区,另外扇区的标号0扇区开始,从mbr所在的扇区开始标号。两个fat表是连在一起存放的。之后有个根目录区,根目录后面就是数据区了。未完待续。有不准确的地方希望大家指正。