12 novembro, 2012

Sistema de Tabelamento de Arquivos FAT(do 12 ao 32) - Regiao Reservada

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.