Atualmente estou desenvolvendo algum sistema operacional em uma máquina Linux. No processo, quero criar um sistema de arquivos FAT12 em um arquivo (por exemplo, Disk.img). Eu uso o comando mkfs da seguinte maneira:
touch Disk.img
truncate Disk.img -s 1M
mkfs.vfat -F12 Disk.img
Ao visualizar com um editor hexadecimal, observo que 'SECTORS_PER_FAT' é 2 por padrão. Eu quero fazer 9.. Como posso fazer isso??
editar: O bloco de parâmetros do BIOS possui as seguintes informações (que eu simplesmente não quero fazer manualmente e quero usar o mkfs)
(Este é um trecho montado dehttp://www.brokenthorn.com/Resources/OSDev5.html)
bpbBytesPerSector: DW 512
bpbSectorsPerCluster: DB 1
bpbReservedSectors: DW 1
bpbNumberOfFATs: DB 2
bpbRootEntries: DW 224
bpbTotalSectors: DW 2880
bpbMedia: DB 0xF0
bpbSectorsPerFAT: DW 9 ;!!!!This is the thing I want to control!!!!
bpbSectorsPerTrack: DW 18
bpbHeadsPerCylinder: DW 2
bpbHiddenSectors: DD 0
bpbTotalSectorsBig: DD 0
bsDriveNumber: DB 0
bsUnused: DB 0
bsExtBootSignature: DB 0x29
bsSerialNumber: DD 0xa0a1a2a3
bsVolumeLabel: DB "MOS FLOPPY "
bsFileSystem: DB "FAT12 "
Aliás... acho que o número total de clusters e setores por cluster deve determinar automaticamente o tamanho do FAT (em número de setores)... Portanto, definir setores_per_fat no BPB pode ser redundante... O que significa que não pode demorar qualquer valor arbitrário....
Responder1
Observo que 'SECTORS_PER_FAT' é 2 por padrão. Quero fazer 9. Como posso fazer isso?
Parece que esse número é calculado automaticamente. Como a Tabela de Alocação de Arquivos possui uma entrada por cluster e o número de clusters é finito e conhecido antecipadamente, não faz sentido alocar mais setores para o FAT.
No seu caso, 2 não é "por padrão", é determinado principalmente pelo tamanho do sistema de arquivos (o tamanho de Disk.img
) e pelo tamanho do cluster.
Considere o tamanho mínimo possível do cluster (ou seja, tamanho mínimo do setor lógico ( -S512
) e número mínimo de setores por cluster ( -s1
)):
# 'touch' is not needed, 'truncate' is enough
truncate Disk.img -s 1M
mkfs.vfat -F12 -S512 -s1 Disk.img
# the below line extracts the value we're after
<Disk.img od -j22 -N2 -tu2 | awk 'NR==1{print $2}'
Isso fornece o número máximo de clusters para um determinado tamanho de arquivo, portanto, o número máximo de entradas no FAT, o tamanho máximo do FAT e o número máximo de setores necessários por FAT. Ainda assim são apenas 6.
Acho que em teoria você pode alocar formalmente mais setores e o sistema de arquivos será válido. A questão é que qualquer sector adicional no FAT nunca seria utilizado porque todos os clusters já estão cobertos por entradas nestes 6 sectores. Na prática mkfs.vfat
não desperdiça setores como este.
Durocalcule como 1 MiB e -S512 -s1
dê 6 setores por FAT:
- Nósnegligênciaestruturas diferentes de clusters como se todo o espaço contribuísse para clusters. Com
-S512 -s1
um cluster leva 0,5 KiB. 1 MiB contém exatamente 2 Ki desses clusters. Observe neste cálculo que o número de clusters éinfladoem relação ao valor estrito. - No FAT12, uma entrada ocupa 12 bits (2 entradas por 3 bytes), portanto 1,5 B. Precisamos de uma entrada por cluster. 2 Ki de entradas ocupam 3 KiB. Portanto, o FAT deve ocupar 3 KiB e esse número também éinflado.
- Um único setor tem 0,5 KiB. Você precisa de 6 setores para armazenar 3 KiB. Como 3 KiB foi um pouco inflado, você precisano máximo6 setores.
A ferramenta calcula esse número de forma mais rigorosa.
O número de FATs ( -f
) pouco importa. Não é que os clusters sejam divididos entre FATs separados. FATs adicionais são apenas cópias e cada um ainda atende a todos os clusters. Mais FATs ocupam mais espaço, o que reduz ligeiramente o número de clusters. Para alguns "tamanhos limites" do sistema de arquivos, esse fenômeno afeta o número de setores por FAT. No entanto, para 1 MiB, -S512 -s1
o número necessário de setores por FAT é 6, independentemente de -f
(nota: em meus testes mkfs.vfat
me recusei a criar mais de 4 FATs).
Depois de maximizarmos o número de clusters para um determinado tamanho de sistema de arquivos, a maneira mais fácil de aumentar o número de setores por FAT é aumentar o sistema de arquivos. Obtivemos 6 por 1 MiB, então provavelmente obteremos 9 por 1,5 MiB. De fato:
truncate Disk.img -s 1536k
mkfs.vfat -F12 -S512 -s1 Disk.img
<Disk.img od -j22 -N2 -tu2 | awk 'NR==1{print $2}'
Nota 1536k
não é o tamanho mínimo para obter 9. Nos meus testes 1389k
me deu 9 e 1388k
me deu 8. Agora pode-se ver como -f
afeta o número. For 1389k
-f2
(o valor padrão) dá 9 e -f3
dá 8. For 1388k
-f1
dá 9 e -f2
dá 8.
Minha plataforma de teste:
- Debian GNU/Linux 9
mkfs.vfat
como link simbólico paramkfs.fat
mkfs.fat
versão: 4.1 (24/01/2017)
Referências:
- O sistema de arquivos FATpor Andries Brouwer
(é de 2002, mas não acho que o FAT12 tenha mudado significativamente desde então) - Projeto do sistema de arquivos FATna Wikipédia