Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1684418
  • 博文数量: 511
  • 博客积分: 967
  • 博客等级: 准尉
  • 技术积分: 2560
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-06 14:19
文章分类

全部博文(511)

文章存档

2016年(11)

2015年(61)

2014年(257)

2013年(63)

2012年(119)

分类: LINUX

2012-12-03 23:44:25

SD卡的体系结构将在这里叙述。它定义了数据区域的逻辑结构。对于如分割数据区域的区别,第一分区有主启动记录和分区表。SD卡文件系统使用FAT文件系统(ISO/IEC 9293)并支持FAT12和FAT16文件系统格式。

文件系统层

PSN

LSN

分区部分

主启动记录和分区表

0到38

用户部分

系统部分

分区启动部分

39

0

文件分配表

40到63

1到24

根目录

64到95

25到56

用户部分

用户区

96到129791

57到129752

主启动记录和分区表

BP

长度

文件名

内容

0

446

主启动记录

不限

446

16

分区表(第一部分)

见下表

462

16

分区表(第二部分)

全是0x00

478

16

分区表(第三部分)

全是0x00

494

16

分区表(第四部分)

全是0x00

510

2

信号字(Signature Word)

0x55,0xaa

0到445 主启动记录

此间内容不被叙述。

446到461 分区表(第一部分)

这个部分叙述了第一分区在体系中的信息。这个分区意味着使用者可以没有相互的证明使用普通区域。

462到477 分区表(第二部分)

如果体系只有一个分区,此间内容为0。

478到493 分区表(第三部分)

如果体系只有一个分区,此间内容为0。

494到509 分区表(第四部分)

如果体系只有一个分区,此间内容为0。

510到511 信号字(SignatureWord)

此处记录了0x55(BP 510) 和0xaa。

分区表

BP

长度

文件名

内容

0

1

启动指示

0x00或0x80

1

1

启始磁头

数值

2

2

启始柱面和扇区

数值

4

1

系统ID号

0x01 或 0x04 或 0x06

5

1

终止磁头

数值

6

2

终止柱面和扇区

数值

8

4

Relative Sector

数值

12

4

总扇区

数值

BP0 启动指示

如果以SD卡作为启动(盘),记录0x80,否则记录0x00。

BP1 启始磁头

此处叙述分区的起始磁头。

BP2和3 启始柱面和扇区

此处将叙述分区的启始柱面和扇区。6个位 (在BP2中0到5位) ,将作为启始扇区。10个位(在 BP 2 中的6和7位,在BP3中的0到7的)将作为启始柱面。

BP4 系统ID号

此处叙述文件系统类型。 如果分区大小是少于32680个扇区,它将被记录0x01。如果少于65536个扇区,它将被记录0x04。否则,它将被记录0x06。

BP5 终止磁头

此处记录终止磁头。

BP6和7 终止柱面和扇区

此处记录终止柱面和扇区。6个位(在BP6中的0到位5位)作为结束扇区。10个位(在BP6中的位6和7位,在BP7中的0到7位)作为结束柱面。

BP8到11 Relative Sector

此处叙述这此分区的起始扇区之前存在的数目。

BP12到15总扇区

此处记录总扇区数量。

申请分配表 (FAT)

FAT将包含一个格式ID号和一些项目,每个使用者区域的指示群集。这些项目连续的将是有限的出发由于2 而且项目数目将和~相等对应的群集群集数目。每个项目在 FAT 中将指示对应的群集状态。 FAT 项目将用来识别被分派到每个文件的群集组。

 

一、 我的 bochs 上的 windows 7 的 disk images 介绍

在 bochs 上,我为 windows 7 分配了 10g 的磁盘空间, 这 10g 的分空间,bochs 是这样分配的:cylinders = 20805, heads = 16, spt = 63

cylinders(柱面或道)是 20805,heads(磁头或面)是 16,spt(扇区/柱面 - 每道扇区数)为 63

那么:磁盘空间为:disk size = cylinders * 63 * heads * 512 = 20805 * 63 * 16 * 512 = 10,737,377,280 bytes = 10g

二、硬盘的 MBR(主引导记录)

MBR 是位于:0 扇区(逻辑扇区) 即:0 柱面(0-cylinder),0 磁头(0-head),1 扇区(1-sector)

大小为 512 bytes。

整个 MBR 的结构如下:

1、磁盘分区表(Disk Partition Table)

在 MBR 里的后 64 个字节里是磁盘的分区表结构,可定义 4 个分区,每个分区 16 bytes,从 0x1be ~ 0x1fe 共 64 bytes。

表1:磁盘分区表1(DPT1)结构

2、下面看看我的 bochs 上安装的 windows 7 分区表

(1)分区1结构

  1. 000001BE 80
  2. 000001BF 20
  3. 000001C0 21
  4. 000001C1 00
  5. 000001C2 07
  6. 00h:未知操作系统
  7. 01h:DOS FAT12(16位扇区数)
  8. 02h:XENIX
  9. 04h:DOS FAT16(16位扇区数)
  10. 05h:DOS 扩展分区(DOS 3.3+)
  11. 06h:DOS 4.0 (Compaq 3.31), 32位扇区数
  12. 07h:HPFS/NTFS
  13. 0ah:OS/2
  14. 0bh:win95 fat32
  15. 0ch:win95 fat32 (LBA)
  16. ... ...
  17. 000001C3 DF
  18. 000001C4 13
  19. 000001C5 0C
  20. 000001C6 00080000
  21. 000001CA 00200300
000001BE 80 000001BF 20 000001C0 21 000001C1 00 000001C2 07 00h:未知操作系统 01h:DOS FAT12(16位扇区数) 02h:XENIX 04h:DOS FAT16(16位扇区数) 05h:DOS 扩展分区(DOS 3.3+) 06h:DOS 4.0 (Compaq 3.31), 32位扇区数 07h:HPFS/NTFS 0ah:OS/2 0bh:win95 fat32 0ch:win95 fat32 (LBA) ... ... 000001C3 DF 000001C4 13 000001C5 0C 000001C6 00080000 000001CA 00200300


可以看出分区1是:

★ boot indicator = 80 表示:该分区是可启动的分区。

★ 起始扇区是:0 - cylinder, 0x20 - heads, 0x21 - sector

1 byte 的 head 最大可表示:0xFF 个 heads,即:255 个 heads

6 bits 的 sector 最大表示: 0x3F 个 sector 即:63 个 sectors

10 bits 的 cylinder 最大表示:0x3FF 个 cylinder 即: 1023 个 cylinders

每个 cylinder 的扇区为:heads * 63 = 255 * 63 = 16065 sectors

那么:分区1的起始扇区是第几扇分区呢? 它的逻辑分区 L 是:

L = cylinder * 16065 + heads * 63 + sector - 1

= 0 * 16065 + 0x20 * 63 + 21 - 1

= 0x20 * 63 + 0x20

= 2048

因此,分区1的起始扇区是第 2048 号扇区,即说明,此分区前面有 2048 个扇区被保留(扇区号从 0 开始编号)

★ 分区1 的文件系统是 ntfs 文件系统。

★ 分区1 的结束扇区是: 0xdf - heads, 0x13 - sectors, 0x0c - cylinder

那么,结束扇区是第几号扇区呢?

L = cylinder * 16065 + heads * 63 + sectors - 1

= 0x0c * 16065 + 0xdf * 63 + 0x13 - 1

= 192780 + 14049 + 18

= 206848

结束扇区是第 206848 号扇区。

因此:分区的扇区数是:206848 - 2048 = 204800 个扇区

★ 分区1 前的扇区数是: 00080000

由于是 little-endian 排列,它的 size 是 0x00000800 即:2048 个扇区

正好符合前面说的 2048 个扇区。

★ 分区1 的扇区数是: 00200300

同样是 little-endian 排列,它的 size 是 0x00032000 即: 204800 个扇区

正好符合前面说的 204800 个扇区数。

size: sectors * 512 byte = 204800 * 512 = 100MB

由此可见,分区1 共有 100M 的磁盘空间。

2、分区 2 的结构

  1. 000001CE 00
  2. 000001CF DF
  3. 000001D0 14
  4. 000001D1 0C
  5. 000001D2 07
  6. 000001D3 FE
  7. 000001D4 FF
  8. 000001D5 FF
  9. 000001D6 00280300
  10. 000001DA 00C83C01
000001CE 00 000001CF DF 000001D0 14 000001D1 0C 000001D2 07 000001D3 FE 000001D4 FF 000001D5 FF 000001D6 00280300 000001DA 00C83C01


可以看出分区2 是:

★ 该分区是不可启动的分区。

★ 起始扇区是:L = 0x0c * 16065 + 0xdf * 63 + 0x14 - 1 = 206849 号扇区,

正好是分区1的结束扇区的地址,表示下一扇区的开始。

★ 文件系统同样是 ntfs

★ 结束扇区是:L = 0x3ff * 16065 + 0xfe * 63 + 0x3f - 1 = 16450559 号扇区。

★ 分区前扇区数:00280300 = 0x00032800 = 206848 扇区。

★ 分区的扇区数:00c83c01 = 0x013cc800 = 20760576 扇区数

那么,分区2的大小是 ≈ 10g 约等于 10g, 由于分区 1 的大小是 100M bytes,分区2大小约为 10g

这里有一个现象:

前面说的结束分区是 16450559 号扇区,明显是不对的。这是因为,cylinder 最大只能表示 1023 个(1023*255*63 =16434495)

超过部分没办法表示,这里就以分区扇数为准。

:(

由此可见:
在 windows 7 的默认分区下,分区1 只是启动分区,分区2 则整个系统的分区。

从 0x00 - 0x162 :这是 MBR 的主体代码区域

从 0x162 - 0x1bd:这是 MBR 用到的数据区域

从 0x1be - 0x1fd: 这是 MBR 的磁盘分区表区域

从 0x1fe - 0x1ff:这是 MBR 的标志 "55AA"

-----------------------------------------------------------------------------------------------------

chs mode是磁盘寻址模式,

c=cyclinder柱面数

h=head磁头数

s=sector扇区数

这是一种传统的硬盘寻址模式,只支持小容量的盘

新的主要是LBA模式(逻辑寻址模式)支持大容量硬盘

#define CHS_MODE 0
#define LBA_MODE !(CHS_MODE)

-----------------------------------------------------------


 
阅读(898) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~