Criando um sistema de arquivos FAT12 especificado usando o comando mkfs

Criando um sistema de arquivos FAT12 especificado usando o comando mkfs

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.vfatnão desperdiça setores como este.


Durocalcule como 1 MiB e -S512 -s1dê 6 setores por FAT:

  1. Nósnegligênciaestruturas diferentes de clusters como se todo o espaço contribuísse para clusters. Com -S512 -s1um 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.
  2. 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.
  3. 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 -s1o número necessário de setores por FAT é 6, independentemente de -f(nota: em meus testes mkfs.vfatme 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 1536knão é o tamanho mínimo para obter 9. Nos meus testes 1389kme deu 9 e 1388kme deu 8. Agora pode-se ver como -fafeta o número. For 1389k -f2(o valor padrão) dá 9 e -f3dá 8. For 1388k -f1dá 9 e -f2dá 8.


Minha plataforma de teste:

  • Debian GNU/Linux 9
  • mkfs.vfatcomo link simbólico paramkfs.fat
  • mkfs.fatversão: 4.1 (24/01/2017)

Referências:

  1. O sistema de arquivos FATpor Andries Brouwer
    (é de 2002, mas não acho que o FAT12 tenha mudado significativamente desde então)
  2. Projeto do sistema de arquivos FATna Wikipédia

informação relacionada