Chinaunix首页 | 论坛 | 博客
  • 博客访问: 21660
  • 博文数量: 5
  • 博客积分: 186
  • 博客等级: 入伍新兵
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-30 22:28
文章分类
文章存档

2011年(5)

分类:

2011-11-26 06:07:01

原文地址:硬盘分区表详解 作者:NuoAiLa

~/notes/note/03硬盘分区表详解.txt.html  1
  2 #                               <硬盘分区表详解>
  3
  4 1. 分区表的位置及识别标志
  5 分区表一般位于硬盘(某柱面的0磁头1扇区), 而第1个分区表总是位于 (0柱面,0磁头,1扇
  6 区),剩余的分区表位置可以由主分区表依次推导出来.分区表有64个字节,占据其所在扇区
  7 的[441-509]字节.要判定是不是分区表,就看其后紧邻的两个字节(也即[510-511])是不是
  8 "55AA",若是,则为分区表.
  9
 10 2. 分区表的结构
 11 2.1 分区表的组成与各个字节的表示意义
 12 分区表由4项组成, 每项16个字节.共4×16 = 64个字节.每项描述一个分区的基本信息.每
 13 个字节的含义如下:
 14  --------------------------------------------------------------------------------
 15  |    字节                                           含义                       |
 16  --------------------------------------------------------------------------------
 17  |  0                    Activeflag.活动标志.若为0x80H,则表示该分区为活动分区.若|
 18  |                      为0x00H,则表示该分区为非活动分区.                       |
 19  --------------------------------------------------------------------------------
 20  |                       该分区的起始可用的空间的磁头号,扇区号,柱面号. 磁头号:第|
 21  |1,2,3                  1字节, 扇区号:第2字节低6位, 柱面号:第2字节高2位 + 第3字|
 22  |                       节.                                                    |
 23  --------------------------------------------------------------------------------
 24  |                      分区文件系统标志:                                       |
 25  |                                   分区未用: 0x00H.                           |
 26  |                                   扩展分区: 0x05H, 0x0FH.                    |
 27  |  4                                FAT16分区: 0x06H.                          |
 28  |                                   FAT32分区: 0x0BH, 0x1BH, 0x0CH, 0x1CH.     |
 29  |                                   NTFS分区: 0x07H.                           |
 30  --------------------------------------------------------------------------------
 31  |5,6,7                  该分区的结束磁头号,扇区号,柱面号, 含义同上.            |
 32  --------------------------------------------------------------------------------
 33  |8,9,10,11              逻辑起始扇区号. 即该分区起点之前已用了的扇区数.        |
 34  --------------------------------------------------------------------------------
 35  |12,13,14,15                该分区所占用的扇区数.                              |
 36  --------------------------------------------------------------------------------
 37                             Figure1.  
 38 note:分区表所在扇区通常在(0磁头, 1扇区), 而该分区的开始扇区通常位于(1磁头, 1扇
 39 区), 中间隔了63 个隐藏扇区.
 40
 41 2.2 分区表项的几个比较重要的字节
 42 1). (1, 2, 3)字节:
 43             00000000 00000000 00000000
 44             ~~~~~~~~ ==^^^^^^ ========
 45             ~ 磁头(面) 8 位
 46             ^ 扇区 6 位
 47             = 柱面(磁道) 10 位
 48 磁头号由第1字节8位表示, 其范围为(0 ~ 2^8-1), 也即(0磁头 ~ 254磁头).(^ 全1不用? ????? ^) 
 49 扇区号由第2字节低6位表示, 其范围为(0 ~ 2^6-1), 扇区号从1开始, 其范围是(1扇区 ~ 63扇区).
 50 柱面号由第2字节高2位 + 第3字节, 共10位表示, 其范围为(0 ~ 2^10-1), 也即(0柱面 ~
 51 1023柱面). 当柱面号超过1023时, 这10位依然表示成1023, 需要注意.      
 52 2). (5, 6, 7)字节含义同上.
 53 3). (8, 9, 10, 11)字节:
 54 如果是主分区表, 则这4个字节表示该分区起始逻辑扇区号与逻辑0扇区(0柱面, 0磁头, 1扇区)之差.
 55 如果非主分区表, 则这4 个字节要么表示该分区起始逻辑扇区号与扩展分区起始逻辑扇区号之差.
 56 要么为63. 详细情况在后面有所阐述.      
 57
 58
 59 2.3 注意:
 60 扇区上的字节是按左边低位, 右边高位的顺序排列的. 所以在取值时, 需要把字节再反一
 61 下, 让高位字节在左边, 低位字节在右边, 这一点在读取逻辑起始扇区号和分区大小时需
 62 要注意. 举个例子:第一项的逻辑起始扇区为(3F 00 00 00), 转换为十进制前要先反一下
 63 字节顺序, 为(00 00 00 3F)然后在转换为十进制, 即63 .同理分区大小为(3F 04 7D 00),
 64 先反为(00 7D 04 3F)再转换为十进制, 即8193087.
 65
 66
 67 3. 逻辑扇区号与(柱面 磁头 扇区)的相互转换:
 68     令L = 逻辑扇区号, C = 柱面号, H = 磁头号, S = 扇区号.
 69     每道扇区数   = 63
 70     每柱面磁头数 = 255
 71     每柱面扇区数 = 每道扇区数 * 每柱面磁头数
 72                  = 63 * 255
 73                  = 16065
 74 note: 柱面号从0开始. 磁头号[0 ~ 254], 扇区号[1 ~ 63]; 逻辑扇区号是也从0开始.
 75 1). (柱面 磁头 扇区)转换成逻辑扇区号的公式为:
 76         L = C*16065 + H*63 + S - 1
 77 2). 逻辑扇区号转换成(柱面 磁头 扇区)公式为:
 78         C =  L / 16065
 79         H = (L % 16065) / 63
 80         S = (L % 16065) % 63 + 1
 81
 82 4. 分区表上只有四项决定了最多只能有4个主分区
 83 每一项表示一个分区, 所以一个分区表最多只能表示4个分区. 主分区表上的4项用来表示
 84 主分区和扩展分区的信息. 因为扩展分区最多只能有一个, 所以硬盘最多可以有四个主分
 85 区或者三个主分区 + 一个扩展分区. 余下的分区表是表示逻辑分区的. 这里有必要阐述一
 86 点: 逻辑区都是位于扩展分区里面的, 并且逻辑分区的个数没有限制.  
 87
 88 5. 硬盘的结构具体如下(图示):
 89 5.1 Boot Sector(主引导分区)的具体结构如下图所示
 90     0000   |------------------------------------------------|
 91            |                                                |
 92            |                                                |
 93            |                Master Boot Record              |
 94            |                                                |
 95            |                                                |
 96            |                主引导记录(446字节)              |
 97            |                                                |
 98            |                                                |
 99            |                                                |
100     01BD   |                                                |
101     01BE   |------------------------------------------------|
102            |                                                |
103     01CD   |              分区信息   1(16字节)              |
104     01CE   |------------------------------------------------|
105            |                                                |
106     01DD   |              分区信息   2(16字节)              |
107     01DE   |------------------------------------------------|
108            |                                                |
109     01ED   |              分区信息   3(16字节)              |
110     01EE   |------------------------------------------------|
111            |                                                |
112     01FD   |              分区信息   4(16字节)              |
113            |------------------------------------------------|      
114            | 01FE                    | 01FF                 |
115            |          55             |            AA        |
116            |------------------------------------------------|
117
118 5.2 主扩展分区的具体结构如下图所示
119     |=======================|
120     | 主扩展分区(/dev/hda2) | ===> 这里不一定是hda2, 有可能是hda3或hda4
121     |-----------------------|
122     |   扩   展  | 分区项 1 |
123     |            |----------|
124     |   分区表   | 分区项 2 |
125     |-----------------------|
126     |                       |
127     | 逻辑盘 1 (/dev/hda5)  |
128     |                       |
129     |=======================|
130     |       扩展分区 2      |
131     |-----------------------|
132     |   扩   展  | 分区项 1 |
133     |            |----------|
134     |   分区表   | 分区项 2 |
135     |-----------------------|
136     |                       |
137     | 逻辑盘 2 (/dev/hda6)  |
138     |                       |
139     |=======================|
140     |       扩展分区 3      |
141     |-----------------------|
142     |   扩   展  | 分区项 1 |
143     |            |----------|
144     |   分区表   | 分区项 2 |
145     |-----------------------|
146     |                       |
147     | 逻辑盘 3 (/dev/hda7)  |
148     |                       |
149     |=======================|
150
151 6. 分区表链的查找
152 分区表链实际上相当于一个单向链表结构. 第一个分区表, 也即主分区表, 可以有一项描
153 述扩展分区. 而这一项就相当于指针, 指向扩展分区. 然后我们根据该指针来到扩展分区
154 起始柱面的0头1扇区, 找到第二个分区表. 对于该分区表, 通常情况下: 第一项描述了扩
155 展分区中第一个分区的信息, 第二项描述下一个分区,而这第二项就相当于指向第二个分区
156 的指针, 第三项, 第四项一般均为0. 我们可以根据该指针来到扩展分区中第二个分区起始
157 柱面的0头1扇区, 找到第三个分区表. 以此类推, 只到最后一个分区表. 而最后一个分区
158 表只有第一项有信息,余下三项均为0.相当于其指针为空.所以只要找到了一个分区表就可
159 以推导找出其后面所有分区表. 不过该分区表前面的分区表就不好推导出来了. 但令人高
160 兴的是这个链表的头节点, 也即主分区表的位置是固定的位于(0柱面, 0磁头, 1扇区)处,
161 我们可以很轻易的找到它, 然后把剩下的所有分区表一一找到.
162
163 7. 例子:
164 7.1 用cfdisk获取分区表数据:
165 Disk Drive: /dev/sda
166 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
167 Sector 0:
168 0x1B0: 00 00 00 00 00 00 00 00 32 F2 49 15 00 00(80 20
169                                                  ** --  
170 0x1C0: 21 00 07 FE FF FF 00 08 00 00 00 A0 C3 03)00 FE
171        ----- == ======== =========== =========== ** --  1
172 0x1D0: FF FF 0F FE FF FF 00 A8 C3 03 00 80 A1 18(00 FE
173        ----- == ======== =========== =========== ** --  2
174 0x1E0: FF FF 07 FE FF FF 56 28 65 1C 2B 1D B7 00)00 00
175        ----- == ======== =========== =========== ** --  3
176 0x1F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA
177 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
178 Sector 63154176:
179 0x1B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00(00 FE
180                                                  ** --
181 0x1C0: FF FF 07 FE FF FF 00 08 00 00 00 30 82 07)00 FE
182        ----- == ======== =========== =========== ** --
183 0x1D0: FF FF 05 FE FF FF 00 38 82 07 00 38 82 07 00 00
184        ----- == ======== =========== =========== ** --
185 0x1E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
186 0x1F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA
187 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
188 Sector 189128704:
189 0x1B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00(00 FE
190                                                  ** --
191 0x1C0: FF FF 07 FE FF FF 00 08 00 00 00 30 82 07)00 FE
192        ----- == ======== =========== =========== ** --
193 0x1D0: FF FF 05 FE FF FF DF 9D 04 0F 4B 58 53 09 00 00
194        ----- == ======== =========== =========== ** --
195 0x1E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
196 0x1F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA
197 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
198 Sector 315114975:
199 0x1B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE
200                                                  ** --
201 0x1C0: FF FF 83 FE FF FF 3F 00 00 00 0C 58 53 09 00 FE
202        ----- == ======== =========== =========== ** --
203 0x1D0: FF FF 05 FE FF FF 2A F6 57 18 9E 1B 46 00 00 00
204        ----- == ======== =========== =========== ** --
205 0x1E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
206 0x1F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA
207 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
208 Sector 471572010:
209 0x1B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00(00 FE
210                                                  ** --
211 0x1C0: FF FF 82 FE FF FF 3F 00 00 00 5F 1B 46 00)00 00
212        ----- == ======== =========== =========== ** --
213 0x1D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
214        ----- == ======== =========== =========== ** --
215 0x1E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
216 0x1F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA
217
218
219 7.2 对以下数据分析计算:
220 Sector 0:
221 0x1B0: 00 00 00 00 00 00 00 00 32 F2 49 15 00 00(80 20
222                                                  ** --  
223 0x1C0: 21 00 07 FE FF FF 00 08 00 00 00 A0 C3 03)00 FE
224        ----- == ======== =========== =========== ** --  1
225 0x1D0: FF FF 0F FE FF FF 00 A8 C3 03 00 80 A1 18(00 FE
226        ----- == ======== =========== =========== ** --  2
227 0x1E0: FF FF 07 FE FF FF 56 28 65 1C 2B 1D B7 00)00 00
228        ----- == ======== =========== =========== ** --  3
229 0x1F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA
230
231 (磁头 扇区 柱面)
232 ==============================================================================
233 1). 0:          80H
234 2). 1 2 3:      202100H=0010 0000  0010 0001  0000 0000B
235                         ~~~~~~~~~  ==^^^^^^^  =========
236 起始磁头号:        20H=32D
237 起始扇区号:        10 0001B=33D
238 起始柱面号:        00 0000 0000B=0D
239 (32 33 0 )
240 3). 4:          07H
241 4). 5 6 7:      FEFFFFH=1111 1110  1111 1111  1111 1111B
242                         ~~~~~~~~~  ==^^^^^^^  =========
243 结束磁头号:        FEH=254D
244 结束扇区号:        11 1111B=63D
245 结束柱面号:        11 1111 1111B=1023D (^ 不准确 ^) 
246 (254 63 1023)
247 5). 8 9 10 11:  00080000H
248 逻辑起始扇区号:  00000800H=2048D
249 C=L/16065=2048/16065=0
250 H=L%16065/63=32
251 S=(L%16065)%63+1=33
252 (32 33 0)
253 6). 12 13 14 15:00A0C303H
254 该分区的扇区数: 03C3A000H=63152128D
255 C=L/16065=(63152128+2048-1)/16065=3931
256 H=L%16065/63=42
257 S=(L%16065)%63+1=15
258 (42 15 3931)
259 则: 该分区所占据的空间段为: (32 33 0) ~ (42 15 3931);
260           用逻辑扇区表示为: 2048 ~ 63154176;
261 共占用的间为(逻辑扇区表示): 63152128
262 /dev/sda1
263
264 ==============================================================================
265 1). 0:          00H
266 2). 1 2 3:      FEFFFFH=1111 1110  1111 1111  1111 1111
267                         ~~~~~~~~~  ==^^^^^^^  =========
268 起始磁头号:        254D
269 起始扇区号:        63D
270 起始柱面号:        1023D (^ 不准确 ^) 
271 (32 33 0 )
272 3). 4:          0FH
273 4). 5 6 7:      FEFFFFH=1111 1110  1111 1111  1111 1111
274                         ~~~~~~~~~  ==^^^^^^^  =========
275 结束磁头号:        254D
276 结束扇区号:        63D
277 结束柱面号:        1023D (^ 不准确 ^) 
278 (254 63 1023)
279 5). 8 9 10 11:  00A8C303H
280 逻辑起始扇区号:  63154176D
281 C=L/16065=63154176/16065=3931
282 H=L%16065/63=42
283 S=(L%16065)%63+1=16
284 (42 16 3931)
285 6). 12 13 14 15:0080A118H
286 该分区的扇区数: 413237248D
287 C=L/16065=(413237248+63154176-1)/16065=476391423/16065=29653
288 H=L%16065/63=253
289 S=(L%16065)%63+1=40
290 (253 40 29653)
291 则: 该分区所占据的空间段为: (42 16 3931) ~ (253 40 29653),
292           用逻辑扇区表示为: 63154176 ~ 476391423;
293   占用的空间(逻辑扇区表示): 413237248
294 /dev/sd2
295
296 ==============================================================================
297 1). 0:          00H
298 2). 1 2 3:      FEFFFFH=1111 1110  1111 1111  1111 1111
299                         ~~~~~~~~~  ==^^^^^^^  =========
300 起始磁头号:        254D
301 起始扇区号:        63D
302 起始柱面号:        1023D (^ 不准确 ^) 
303 (32 33 0 )
304 3). 4:          07H
305 4). 5 6 7:      FEFFFFH=1111 1110  1111 1111  1111 1111
306                         ~~~~~~~~~  ==^^^^^^^  =========
307 结束磁头号:        254D
308 结束扇区号:        63D
309 结束柱面号:        1023D (^ 不准确 ^) 
310 (254 63 1023)
311 5). 8 9 10 11:  5628651CH
312 逻辑起始扇区号:  476391510D
313 C=476391510/16065=29654
314 H=(476391510%16065)/63=0
315 S=(476391510%16065)%63+1=1
316 (0 1 29654)
317 6). 12 13 14 15:2B1DB700H
318 该分区的扇区数: 12000555D
319 C=(476391510+12000555-1)/16065=488392064/16065=30400
320 H=254
321 S=63
322 (254 63 30400)
323 则: 该分区所占据的空间段为: (0 1 29654) ~ (254 63 30400),
324           用逻辑扇区表示为: 476391510 ~ 488392064
325 共占用的间为(逻辑扇区表示): 12000555
326
327 /dev/sda3
328 12000555*512/1000000=~=6144.28416(MB)
329
330
331 7.3 验证
332 用cfdisk得到的数据如下:
333 1).
334 ---Starting----      ----Ending-----    Start     Number of
335  # Flags Head Sect  Cyl   ID  Head Sect  Cyl     Sector    Sectors
336 -- ----- ---- ---- ----- ---- ---- ---- ----- ----------- -----------
337  1  0x80   32   33     0 0x07   42   15  3931        2048    63152128
338  2  0x00   42   16  3931 0x0F  253   40 29653    63154176   413237248
339  3  0x00    0    1 29654 0x07  254   63 30400   476391510    12000555
340  4  0x00    0    0     0 0x00    0    0     0           0           0
341  5  0x00   74   48  3931 0x07  182   58 11772        2048   125972480
342  6  0x00  215   28 11772 0x07   68   38 19614        2048   125972480
343  7  0x00    1    1 19615 0x83  254   63 29353          63   156456972
344  8  0x00    1    1 29354 0x82  254   63 29639          63     4594527
345
346 2).
347                    cfdisk (util-linux-ng 2.14.2)
348                         Disk Drive: /dev/sda
349                  Size: 250059350016 bytes, 250.0 GB
350        Heads: 255   Sectors per Track: 63   Cylinders: 30401
351
352  Name  Flags  Part Type   FS Type              [Label]    Size (MB)
353  ---------------------------------------------------------------------
354                Primary    Free Space                           1.05   *
355  sda1  Boot    Primary    NTFS                 [^C]        32333.89   *
356  sda5  NC      Logical    NTFS                 [^G]        64498.96   *
357  sda6  NC      Logical    NTFS                 [^G]        64498.96   *
358                Logical    Free Space                           6.02   *
359  sda7          Logical    Linux ext3                       80106.01
360  sda8          Logical    Linux swap / Solaris              2352.44
361                Pri/Log    Free Space                         115.16
362  sda3          Primary    NTFS                              6144.29
363
364 可以看出, 计算得到的数据和用cfdisk得到的数据一致!
365
366
367 http://blog.hjenglish.com/codeworm/archive/2009/03/07/881247.html#1310149
368
369
阅读(1822) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~