Sistema de Tabelamento de Arquivos FAT
Criado entre os anos 70 e 80, o sistema de arquivos FAT (File Allocation Table, Tabela de Alocação de Arquivo) foi desenvolvido como um sistema de arquivos flexivel aos disquetes menores que 500K de tamanho e com o tempo foram se aperfeiçoad de acordo com o crescimento dos armazenamento.
O tabelamento consiste em 4 regiões:
0 - Região Reservada
1 - Região FAT
2 - Regiao Raiz de Diretório (não existe em volumes FAT32)
3 - Regiao de Arquivos e Diretórios
Boot Sector e BPB
Situado no primeiro setor do volume na Região Reservada, o BPB (da sigla BIOS Parameter Block) ou tambem chamado de "Boot Sector","Reserved Sector" ou "0th Sector", mas o importante é saber que esta no inicio.
Todos os sistema FAT contem o PBP, somente na versão do MS-DOS 1.x nao dispoe.
Estrutura Boot Sector e BPB
0x00 a 0x02 - BS_jmpBoot
Instrução de pulo do código do boot. Este campo permite duas formas:
jmpBoot[0]= 0xEB, jmpBoot[1]= 0x??, jmpBoot[2]= 0x90 e
jmpBoot[0]= 0xE9, jmpBoot[1]= 0x??, jmpBoot[2]= 0x??
0x?? indica que qualquer valor 8 bits é permitido neste campo.
0x03 a 0x0A - BS_OEMName
Geralmente "MSWIN4.1" é posto neste campo. Não é tão usado, mas alguns
drivers usam. Em partes, indica o ultimo sistema que o formatou.
0x0B a 0x0C - BPB_BytsPerSec
Contagem de Bytes por Setor. Pode-se obter os valores entre: 512,1024,2048 e 4096.
0x0D - BPB_SecPerClus
Numero de setores por Cluster. Este valor pode ser em potencia de 2 maior que 0.
Os valores validos sao 1,2,4,8,16,32,64 e 128.
Nota: No calculo de Bytes Per Cluster (BPB_BytsPerSec*BPB_SecPerClus),
o valor nao pode ultrapassar 32k
0x0E a 0x0F - BPB_RsvdSecCnt
Região reservada. Este campo nao pode ser 0x00 0x00. Para FAT12 e FAT16, estes valores
devem ser 0x00 0x01. Em volumes FAT32, Este é tipicalmemte 32 (0x20).
0x10 - BPB_NumFATs
Contagem das estruturas de dados do volume. Este campo deve sempre conter o valor 0x02
para qualquer tipo de volume FAT. Contudo, pode conter valores 0x01 ou maior, porem alguns programas nao ira funcionar corretamente.
0x11 a 0x12 - BPB_RootEntCnt
Para volumes FAT12 e FAT16, este campo contem uma contagem de entrada de diretorios no diretórios raiz que é multiplicado por 32 resultando num multiplo de BPB_BytsPerSec. Para volumes FAT32 este valor pode ser 0x00, e em FAT16 512 (para uma maxima compatibilidade).
0x13 - 0x14 - BPB_TotSec16
Para os volumes FAT12 e FAT16, este campo é a contagem de 16bits dos setores do volume. Esta contagem inclue todos os setores das 4 regiões.
BPB_TotSec32 neste caso é 0x00.
Para volumes FAT32 este campo é 0x00, e o campo BPB_TotSec32 é usado.
0x15 - BPB_Media
Este campo define o tipo de midia a em uso. 0xF8 é definido como midia não-removivel.
Os valores 0xF0,0xF8 a 0xFF são valores legais.
****
0x16 a 0x17 - BPB_FATSz16
Este é a contagem de 16bits de setores ocupado por 1 FAT em volumes FAT12/FAT16.
Em FAT32, este campo pode ser 0x00 0x00 e BPB_FATSz32 é usado.
0x18 a 0x19 - BPB_SecPerTrk
Setores por Trilha para a interrupção 0x13. Este campo somente é relevante para midias
que tem a geometria (volumes divididos em trilhas por multiplos de cabeçalhos e cilindros)
e sao visiveis na interrupção 0x13.
0x1A a 0x1B - BPB_NumHeads
Numero de Cabeçalhos para a interrupção 0x13. O mesmo discutido no campo anterior,
este campo trata da quantidade de cabeçalhos.
0x1C a 0x1F - BPB_HiddSec
Contagem de setores ocultados precedendo a partição que contem o volume. Este campo
é util para midias que são visiveis na interrupção 0x13.
Para midias nao particionados, este valor deve ser 0x00 0x00 0x00 0x00.
0x20 a 0x23 - BPB_TotSec32
Este campo é uma contafem de 32 bits dos setores no volume. Este campo contem a
contagem de todos os setores nas quatros regiões do volume.
A partir deste ponto os sistema se diferenciam.
Aqui temos a estrutura dos Sistemas FAT12/FAT16 a partir do valor 0x24 do setor de boot:
0x24 - BS_DrvNum
Tipo de midia, 0x80 para Disco Rigido, 0x00 para Disquete.
Este campo suporta o bootstrap.
0x25 BS_Reserved1
Reservado. Deve ser 0x00 (usado pelo Windows NT).
0x26 - BS_BootSig
Extensão de assinatura de Boot (0x29). Este byte de assinatura indica que os tres campos
a seguir no boot sector estão presentes.
0x27 a 0x2A - BS_VolID
Numero Serial do Volume.Este campo junto com o BS_VolLab, suporta o rastreamento
do volume em midias removiveis. Estes valores permitem ao sistema FAT detectar um
disco inserido errado no driver. O ID é usualmente gerado por uma simples combinação de
Data e Hora em um valor de 32 bits.
0x2B a 0x36 - BS_VolLab
Etiqueta do Volume. Este campo combina os 11 bytes gravados no diretório raiz.
Nota: Sistema FAT deve sempre atualizar este campo quando a etiqueta do volume no
diretório raiz foi alterada ou criada. Quando não há uma etiqueta para o volume, é assumido
a linha "NO NAME ".
0x36 a 0x3E - BS_FilSysType
Uma das linhas "FAT12 ","FAT16 " ou "FAT ".
Nota: É comum se confudir este como a definição do sistema do volume. Esta linha so tem
valor informativo, tanto até que não esta situado na parte BPB.
Estrutura FAT32 iniciando pelo valor 0x24 do setor de boot:
0x24 a 0x27 - BPB_FATSz32
Este campo é a contagem de setores usados no FAT 1. BPB_FATSz16 deve ser 0x00.
0x28 a 0x29 - BPB_ExtFlags
Bits 0 a 3 -> Numeros de FAT ativos. Valido se copia é desativado.
Bits 4 a 6 -> Reservado.
Bits 7 -> 0 Indica que o FAT esta sendo copiado a todo o momento.
1 Indica que o FAT está ativo; referencia nos bits anteriores.
Bits 8 a 15 -> Reservado.
0x2A a 0x2B - BPB_FSVer
Numero da versão do volume FAT. Utilitários de volumes respeitam este campo, não
operando nestes volumes caso nao estejam de acordo com o funcionamento.
0x2C a 0x2F - BPB_RootClus
Este é usado para definir o numero do cluster do primeiro cluster do diretório raiz,
usualmente 2 mas não tao requirido.
0x30 a 0x31 - BPB_FSInfo
Numero do setor da estrutura FSINFO na area reservad do volume FAT32. Usualmente 1.
0x32 a 0x33 - BPB_BkBootSec
Se diferente de 0, indica o setor na area reservada do volume da copia do boot.
Usualmente 6.
0x34 a 0x3F - BPB_Reserved
Reservador para futuras expansões. Deve ser sempre 0.
0x40 - BPB_DrvNum
Tem a mesma função do FAT12 e FAT16, com a diferença de que para FAT32 é
direcionado um outro valor no setor de boot.
0x41 - BS_Reserved1
Tem a mesma função do FAT12 e FAT16, com a diferença de que para FAT32 é
direcionado um outro valor no setor de boot.
0x42 - BS_BootSig
Tem a mesma função do FAT12 e FAT16, com a diferença de que para FAT32 é
direcionado um outro valor no setor de boot.
0x43 a 0x46 - BS_VolID
Tem a mesma função do FAT12 e FAT16, com a diferença de que para FAT32 é
direcionado um outro valor no setor de boot.
0x46 a 0x51 - BS_VolLab
Tem a mesma função do FAT12 e FAT16, com a diferença de que para FAT32 é
direcionado um outro valor no setor de boot.
0x52 a 0x59 - BS_FilSysType
Sempre definido como "FAT32 ".
Uma nota importante sobre o setor 0 do volume FAT, se consideramos o conteudo do setor como um arranjo de bytes, pode ser que o setor [510] seja igual a 0x55 e o setor [511] iguaç a 0xAA.
Outro fato é que muitos documentos dizem que a assinatura 0xAA55 ocupa os ultimos 2 bytes do setor de boot, estaria correto se somente BPB_BytsPerSec for 512.
No proximo post, falarei da Regiao FAT.
0x0E a 0x0F - BPB_RsvdSecCnt
Região reservada. Este campo nao pode ser 0x00 0x00. Para FAT12 e FAT16, estes valores
devem ser 0x00 0x01. Em volumes FAT32, Este é tipicalmemte 32 (0x20).
0x10 - BPB_NumFATs
Contagem das estruturas de dados do volume. Este campo deve sempre conter o valor 0x02
para qualquer tipo de volume FAT. Contudo, pode conter valores 0x01 ou maior, porem alguns programas nao ira funcionar corretamente.
0x11 a 0x12 - BPB_RootEntCnt
Para volumes FAT12 e FAT16, este campo contem uma contagem de entrada de diretorios no diretórios raiz que é multiplicado por 32 resultando num multiplo de BPB_BytsPerSec. Para volumes FAT32 este valor pode ser 0x00, e em FAT16 512 (para uma maxima compatibilidade).
0x13 - 0x14 - BPB_TotSec16
Para os volumes FAT12 e FAT16, este campo é a contagem de 16bits dos setores do volume. Esta contagem inclue todos os setores das 4 regiões.
BPB_TotSec32 neste caso é 0x00.
Para volumes FAT32 este campo é 0x00, e o campo BPB_TotSec32 é usado.
0x15 - BPB_Media
Este campo define o tipo de midia a em uso. 0xF8 é definido como midia não-removivel.
Os valores 0xF0,0xF8 a 0xFF são valores legais.
****
0x16 a 0x17 - BPB_FATSz16
Este é a contagem de 16bits de setores ocupado por 1 FAT em volumes FAT12/FAT16.
Em FAT32, este campo pode ser 0x00 0x00 e BPB_FATSz32 é usado.
0x18 a 0x19 - BPB_SecPerTrk
Setores por Trilha para a interrupção 0x13. Este campo somente é relevante para midias
que tem a geometria (volumes divididos em trilhas por multiplos de cabeçalhos e cilindros)
e sao visiveis na interrupção 0x13.
0x1A a 0x1B - BPB_NumHeads
Numero de Cabeçalhos para a interrupção 0x13. O mesmo discutido no campo anterior,
este campo trata da quantidade de cabeçalhos.
0x1C a 0x1F - BPB_HiddSec
Contagem de setores ocultados precedendo a partição que contem o volume. Este campo
é util para midias que são visiveis na interrupção 0x13.
Para midias nao particionados, este valor deve ser 0x00 0x00 0x00 0x00.
0x20 a 0x23 - BPB_TotSec32
Este campo é uma contafem de 32 bits dos setores no volume. Este campo contem a
contagem de todos os setores nas quatros regiões do volume.
A partir deste ponto os sistema se diferenciam.
Aqui temos a estrutura dos Sistemas FAT12/FAT16 a partir do valor 0x24 do setor de boot:
0x24 - BS_DrvNum
Tipo de midia, 0x80 para Disco Rigido, 0x00 para Disquete.
Este campo suporta o bootstrap.
0x25 BS_Reserved1
Reservado. Deve ser 0x00 (usado pelo Windows NT).
0x26 - BS_BootSig
Extensão de assinatura de Boot (0x29). Este byte de assinatura indica que os tres campos
a seguir no boot sector estão presentes.
0x27 a 0x2A - BS_VolID
Numero Serial do Volume.Este campo junto com o BS_VolLab, suporta o rastreamento
do volume em midias removiveis. Estes valores permitem ao sistema FAT detectar um
disco inserido errado no driver. O ID é usualmente gerado por uma simples combinação de
Data e Hora em um valor de 32 bits.
0x2B a 0x36 - BS_VolLab
Etiqueta do Volume. Este campo combina os 11 bytes gravados no diretório raiz.
Nota: Sistema FAT deve sempre atualizar este campo quando a etiqueta do volume no
diretório raiz foi alterada ou criada. Quando não há uma etiqueta para o volume, é assumido
a linha "NO NAME ".
0x36 a 0x3E - BS_FilSysType
Uma das linhas "FAT12 ","FAT16 " ou "FAT ".
Nota: É comum se confudir este como a definição do sistema do volume. Esta linha so tem
valor informativo, tanto até que não esta situado na parte BPB.
Estrutura FAT32 iniciando pelo valor 0x24 do setor de boot:
0x24 a 0x27 - BPB_FATSz32
Este campo é a contagem de setores usados no FAT 1. BPB_FATSz16 deve ser 0x00.
0x28 a 0x29 - BPB_ExtFlags
Bits 0 a 3 -> Numeros de FAT ativos. Valido se copia é desativado.
Bits 4 a 6 -> Reservado.
Bits 7 -> 0 Indica que o FAT esta sendo copiado a todo o momento.
1 Indica que o FAT está ativo; referencia nos bits anteriores.
Bits 8 a 15 -> Reservado.
0x2A a 0x2B - BPB_FSVer
Numero da versão do volume FAT. Utilitários de volumes respeitam este campo, não
operando nestes volumes caso nao estejam de acordo com o funcionamento.
0x2C a 0x2F - BPB_RootClus
Este é usado para definir o numero do cluster do primeiro cluster do diretório raiz,
usualmente 2 mas não tao requirido.
0x30 a 0x31 - BPB_FSInfo
Numero do setor da estrutura FSINFO na area reservad do volume FAT32. Usualmente 1.
0x32 a 0x33 - BPB_BkBootSec
Se diferente de 0, indica o setor na area reservada do volume da copia do boot.
Usualmente 6.
0x34 a 0x3F - BPB_Reserved
Reservador para futuras expansões. Deve ser sempre 0.
0x40 - BPB_DrvNum
Tem a mesma função do FAT12 e FAT16, com a diferença de que para FAT32 é
direcionado um outro valor no setor de boot.
0x41 - BS_Reserved1
Tem a mesma função do FAT12 e FAT16, com a diferença de que para FAT32 é
direcionado um outro valor no setor de boot.
0x42 - BS_BootSig
Tem a mesma função do FAT12 e FAT16, com a diferença de que para FAT32 é
direcionado um outro valor no setor de boot.
0x43 a 0x46 - BS_VolID
Tem a mesma função do FAT12 e FAT16, com a diferença de que para FAT32 é
direcionado um outro valor no setor de boot.
0x46 a 0x51 - BS_VolLab
Tem a mesma função do FAT12 e FAT16, com a diferença de que para FAT32 é
direcionado um outro valor no setor de boot.
0x52 a 0x59 - BS_FilSysType
Sempre definido como "FAT32 ".
Uma nota importante sobre o setor 0 do volume FAT, se consideramos o conteudo do setor como um arranjo de bytes, pode ser que o setor [510] seja igual a 0x55 e o setor [511] iguaç a 0xAA.
Outro fato é que muitos documentos dizem que a assinatura 0xAA55 ocupa os ultimos 2 bytes do setor de boot, estaria correto se somente BPB_BytsPerSec for 512.
No proximo post, falarei da Regiao FAT.