Chinaunix首页 | 论坛 | 博客
  • 博客访问: 542207
  • 博文数量: 99
  • 博客积分: 4010
  • 博客等级: 上校
  • 技术积分: 1117
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-23 15:17
文章分类

全部博文(99)

文章存档

2011年(4)

2010年(13)

2009年(82)

我的朋友

分类: LINUX

2009-07-07 13:51:15

最近在搞SD卡的linux驱动,在调试过程中老发现我对SD卡写入文件后再进SD卡是发现文件名错误
如下所示:
/mnt # ls -l
ls: ./  pf.: No such file or directory
-rwxr-xr-x    1 root     root          566 Jan  1 00:00   pf
-rwxr-xr-x    1 root     root     14248705 Jul 29  2008 ipct   p. ra
-rwxr-xr-x    1 root     root       100668 Jan  1 00:02 u-boot96.bin
很不爽于是看了下FAT32和16的存储结构,现整理如下,方便以后使用,呵呵
大型操作系统一般采用了F A T 1 6 或32文件系统,一个F A T( F A T 1 2 / F A T 16
/ F A T , 2 ) 文件系统卷 ( 卷可以理解为是一张软盘、一个硬盘或是一个F l a s h 电子盘)由五个部分
组 成
    1 .MB R区
硬盘的主引导扇区,分区表,分区引导扇区(MBR、DPT、DBR、BPB)是电脑BIOS自检完成后,操作系统开始引导系统前整个电脑运作过程中需要检查的重要参数,硬盘的主引导扇区,分区表,分区引导扇区(MBR、DPT、DBR、BPB)参数错误可能导致系统无法启动或存储的数据丢失,在此介绍一下硬盘的主引导扇区,分区表,分区引导扇区(MBR、DPT、DBR、BPB)的详细信息。
  硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR),该记录占用512个字节,它用于硬盘启动时将系统控制权转给用户指定的、在分区表中登记了某个操作系统分区。MBR的内容是在硬盘分区时由分区软件(如FDISK)写入该扇区的,MBR不属于任何一个操作系统,不随操作系统的不同而不同,即使不同,MBR也不会夹带操作系统的性质,具有公共引导的特性。但安装某些多重引导功能的软件或LINUX的LILO时有可能改写它;它先于所有的操作系统被调入内存并发挥作用,然后才将控制权交给活动主分区内的操作系统。
       绝对扇区号为0x00000000处(硬盘的0柱面、0磁头、1扇区)是主引导记录,总共512 字节,
MB R 又称作主引导记录(主引导程序),占 用Bootsector的前446  个字节( 0~0x1bd ) ,
存放系统主引导程序( 它负责从活动分区中装载并运行系统引导程序) 。
       D P T 即主分区表占 用 6 4个字节( 0x1BE to  0x1FD ) ,记录了磁盘的基本分区信息,主分区表
 分为四个分区项,每项1 6字节,分别记录了每个主分区的信息( 因此最多可以有四个主分区) 。
      BootRecord即引导区标记占用两个字节 ( 0x1FE 0X1FF ) ,对于合法引导区,它等于
      0X55AA,这是判别引导区是否合法的标志。
硬盘的主引导程序代码是从偏移0000H开始到偏移01BDH结束的446字节;主引导程序代码包括一小段执行代码。启动PC 机时,系统首先对硬件设备进行测试,成功后进入自举程序INT 19H;然后读系统磁盘0柱面、0磁头、1扇区的主引导扇区MBR的内容到内存指定单元0:7C00 首地址开始的区域,并执行MBR程序段。
  主引导代码实现下列功能:
  1.扫描分区表查找活动分区;
  2.寻找活动分区的起始扇区;
  3.将活动分区的引导扇区读到内存;
  4.执行引导扇区的运行代码。
  如果主引导代码未完成这些功能,系统显示下列错误信息:
  Invalid partition table
  Error loading operating system
  Missing operating system
     2 .D B R( 系统引导记录,分区引导扇区)
      D B R是操作系统可以直接访问的第一个扇区, 包括一个引导程序和一个称为B P B的本分区参数记录表。引导程序的主要任务是当MB R将系统控制权交给它时, 判断本分区跟目录前两个文件是不是操作系统的引导文件。如果确定是,就将其读入内存,并把控制权交给该文件。B P B参数块记录着本分区的启始扇区、结束扇区、文件存储格式、硬盘介质描述符、根目录大小、F A T 个数、分配单元的大小等重要参数。
分区引导扇区DBR(DOS BOOT RECORD)是由FORMAT高级格式化命令写到该扇区的内容;DBR是由硬盘的MBR装载的程序段。DBR装入内存后,即开始执行该引导程序段,其主要功能是完成操作系统的自举并将控制权交给操作系统。每个分区都有引导扇区,但只有被设为活动分区的DBR才会被MBR装入内存运行。
DBR主要由下列几个部分组成:
  1.跳转指令,占用3个字节的跳转指令将跳转至引导代码。
  2.厂商标识和DOS版本号,该部分总共占用8个字节。
  3.BPB(BIOS Parameter Block, BIOS 参数块)。
  4.操作系统引导程序。
  5.结束标志字,结束标志占用2个字节,其值为AA55
  DBR中的内容除了第5部分结束标志字固定不变之外,其余4个部分都是不确定的,其内容将随格式化所用的操作系统版本及硬盘的逻辑盘参数的变化而变化。
在此介绍下FAT32的分区引导扇区 DBR
  为了使加载文件的操作更加灵活,加上FAT32文件系统采用"活动"的FDT表,,同时考虑到引导程序的代码量和为今后发展保留适当的余量,FAT32文件系统分区引导扇区占据了6个扇区,只有前3个扇区作为系统的分区引导扇区,其余3个扇区保留暂未使用。分区引导扇区对于操作系统的启动和磁盘文件的访问具有至关重要的作用;引导程序代码的损坏将导致操作系统不能正常启动,磁盘读写参数的破坏将造成存储在磁盘上的文件不能正常读写。
由于分区引导扇区的重要性,FAT32文件系统在在第一个分区引导扇区的6个扇区后的6个扇区里保留了分区引导扇区的备份,在启动时操作系统可以对两份引导扇区进行比较,以便选择正确的引导扇区来引导系统。由于在磁盘正常工作过程中系统不再对引导扇区的程序和数据进行修改,因此备份的分区引导扇区损坏的可能性非常小。
分区引导扇区的第一个扇区(表1和2)的前三个字节是一条跳转指令,然后是8个字节长的OEM ID(厂家标识)和版本号,其后是简称为BPB的BIOS参数块(BIOS Parameter Block)。对于FAT32其各部分的意义如下表:

1  FAT32分区的BPB字段     

字节位移

字段长度(字节)

8

对应取值

名称和定义

0x0B

2

0x0200

扇区字节数(Bytes Per Sector) 扇区的大小。本字段合法的十进制值有512102420484096。对大多数磁盘来说,本字段的值为512

0x0D

1

0x08

每簇扇区数(Sectors Per Cluster),一簇中的扇区数。由于FAT32文件系统只能跟踪有限个簇(最多为4 294 967 296),因此,通过增加每簇扇区数,可以使FAT32文件系统支持最大分区数。一个分区缺省的簇大小取决于该分区的大小。本字段的合法十进制值有1248163264128Windows 2000FAT32实现只能创建最大为32GB的分区。但是,Windows 2000能够访问由其他操作系统(Windows 95OSR2及其以后的版本)所创建的更大的分区

0x0e

2

0x0020

保留扇区数(Reserved Sector) 第一个FAT开始之前的扇区数,包括引导扇区。本字段的十进制值一般为32

0x10

1

0x02

FAT(Number of FAT) 该分区上FAT的副本数。本字段的值一般为2

0x11

2

0x0000

根目录项数(Root Entries)只有FAT12/FAT16使用此字段。对FAT32分区而言,本字段必须设置为 0

0x13

2

0x0000

小扇区数(Small Sector)(只有FAT12/FAT16使用此字段)FAT32分区而言,本字段必须设置为0

0x15

1

0xF8

媒体描述符( Media Descriptor)提供有关媒体被使用的信息。值0xF8表示硬盘,0xF0表示高密度的3.5寸软盘。媒体描述符要用于MS-DOS FAT16磁盘,在Windows 2000中未被使用

0x16

2

0x0000

FAT扇区数(Sectors Per FAT)只被FAT12/FAT16所使用,FAT32分区而言,本字段必须设置为0

0x18

2

0x003F

每道扇区数(Sectors Per Track) 包含使用INT13h的磁盘的每道扇区数几何结构值。该分区被多个磁头的柱面分成了多个磁道

0x1A

2

0x00FF

磁头数(Number of Head) 本字段包含使用INT 13h的磁盘的磁头数几何结构值。例如,在一张1.44MB 3.5英寸的软盘上,本字段的值为 2

0x1C

4

0x0000003F

隐藏扇区数(Hidden Sector) 该分区上引导扇区之前的扇区数。在引导序列计算到根目录的数据区的绝对位移的过程中使用了该值。本字段一般只对那些在中断13h上可见的媒体有意义。在没有分区的媒体上它必须总是为0

0x20

4

0x007D043F

总扇区数(Large Sector) 本字段包含FAT32分区中总的扇区数

0x24

4

0x00001F32

FAT扇区数(Sectors Per FAT)(只被FAT32使用)该分区每个FAT所占的扇区数。利用这个数和 FAT数以及隐藏扇区数(本表中所描述的)来决定根目录从哪里开始。该计算机还可以从目录中的项数决定该分区的用户数据区从哪里开始

0x28

2

0x00

扩展标志(Extended Flag)(只被FAT32使用)该两个字节结构中各位的值为:
0-3
:活动 FAT(0开始计数,而不是1).

 只有在不使用镜像时才有效
4-6:保留

70值意味着在运行时FAT被映射到所有的FAT

     1值表示只有一个FAT是活动的

8-15:保留

0x2A

2

0x0000

文件系统版本(File ystem Version)只供FAT32使用,高字节是主要的修订号,而低字节是次要的修订号。本字段支持将来对该FAT32媒体类型进行扩展。如果本字段非零,以前的Windows版本将不支持这样的分区

0x2C

4

0x00000002

根目录簇号(Root Cluster Number)(只供FAT32使用) 根目录第一簇的簇号。本字段的值一般为2,但不总是如此

0x30

2

0x0001

文件系统信息扇区号(File System Information SectorNumber)(只供FAT32使用) FAT32分区的保留区中的文件系统信息(File System Information, FSINFO)结构的扇区号。其值一般为1。在备份引导扇区(Backup Boot Sector)中保留了该FSINFO结构的一个副本,但是这个副本不保持更新

0x34

2

0x0006

备份引导扇区(只供FAT32使用) 为一个非零值,这个非零值表示该分区保存引导扇区的副本的保留区中的扇区号。本字段的值一般为6,建议不要使用其他值

0x36

12

12个字节均为0x00

保留(只供FAT32使用)供以后扩充使用的保留空间。本字段的值总为0

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