Crear un sistema de archivos FAT12 específico usando el comando mkfs

Crear un sistema de archivos FAT12 específico usando el comando mkfs

Actualmente estoy desarrollando un sistema operativo en una máquina Linux. En el proceso, quiero crear un sistema de archivos FAT12 en un archivo (por ejemplo, Disk.img). Utilizo el comando mkfs de la siguiente manera:

touch Disk.img
truncate Disk.img -s 1M
mkfs.vfat -F12 Disk.img

Al verlo con un editor hexadecimal, observo que 'SECTORS_PER_FAT' es 2 de forma predeterminada. Quiero que sea 9. ¿Cómo puedo hacer esto?

editar: El bloque de parámetros del BIOS tiene la siguiente información (que simplemente no quiero hacer a mano y quiero usar mkfs en su lugar)

(Este es un fragmento de ensamblaje 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   "

Por cierto... Creo que el número total de clusters y sectores por cluster debería determinar automáticamente el tamaño de FAT (en número de sectores)... Por lo tanto, definir sectores_per_fat en el BPB podría ser redundante... Lo que significa que no puede tomar cualquier valor arbitrario....

Respuesta1

Observo que 'SECTORS_PER_FAT' es 2 por defecto. Quiero que sea 9. ¿Cómo puedo hacer esto?

Parece que este número se calcula automáticamente. Dado que la tabla de asignación de archivos tiene una entrada por grupo y el número de grupos es finito y se conoce de antemano, no tiene sentido asignar más sectores a FAT.

En su caso, 2 no es "por defecto", está determinado principalmente por el tamaño del sistema de archivos (el tamaño de Disk.img) y el tamaño del clúster.

Tome el tamaño de clúster mínimo posible (es decir, el tamaño mínimo de sector lógico ( -S512) y el número mínimo de sectores por clúster ( -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}'

Esto le proporciona el número máximo de clústeres para el tamaño de archivo dado, es decir, el número máximo de entradas en FAT, es decir, el tamaño máximo de FAT, es decir, el número máximo de sectores necesarios por FAT. Aún así son sólo 6.

Creo que, en teoría, puedes asignar formalmente más sectores y el sistema de archivos será válido. La cuestión es que ningún sector adicional en FAT nunca se utilizaría porque todos los grupos ya están cubiertos por entradas en estos 6 sectores. En la práctica mkfs.vfatno se desperdician sectores como este.


BrutoCalcule cómo 1 MiB y -S512 -s1dé 6 sectores por FAT:

  1. Nosotrosdescuidoestructuras distintas a los clusters como si todo el espacio contribuyera a los clusters. Con -S512 -s1un cluster se necesitan 0,5 KiB. 1 MiB contiene exactamente 2 Ki de dichos grupos. Tenga en cuenta que en este cálculo el número de grupos esinfladorespecto al valor estricto.
  2. En FAT12, una entrada ocupa 12 bits (2 entradas por 3 bytes), es decir, 1,5 B. Necesitamos una entrada por grupo. 2 Ki de entradas toman 3 KiB. Entonces FAT debería tomar 3 KiB y este número también esinflado.
  3. Un solo sector equivale a 0,5 KiB. Necesitas 6 sectores para contener 3 KiB. Dado que 3 KiB estaban algo inflados, es necesarioa lo sumo6 sectores.

La herramienta calcula este número de forma más estricta.


El número de FAT ( -f) poco importa. No es que los grupos estén divididos entre FAT separadas. Las FAT adicionales son solo copias y cada una sigue sirviendo a todos los clústeres. Más FAT ocupan más espacio, lo que reduce ligeramente la cantidad de clústeres. Para algunos "umbrales" del sistema de archivos, este fenómeno afecta la cantidad de sectores por FAT. Sin embargo, para 1 MiB, -S512 -s1la cantidad necesaria de sectores por FAT es 6 independientemente -f(nota: en mis pruebas mkfs.vfatme negué a crear más de 4 FAT).

Después de maximizar la cantidad de clústeres para el tamaño del sistema de archivos dado, la forma más fácil de aumentar la cantidad de sectores por FAT es agrandar el sistema de archivos. Obtuvimos 6 por 1 MiB, por lo que probablemente obtengamos 9 por 1,5 MiB. En efecto:

truncate Disk.img -s 1536k
mkfs.vfat -F12 -S512 -s1 Disk.img
<Disk.img od -j22 -N2 -tu2 | awk 'NR==1{print $2}'

Tenga en cuenta 1536kque no es el tamaño mínimo para obtener 9. En mis pruebas 1389kme dio 9 y 1388kme dio 8. Ahora se puede ver cómo -fafecta el número. For 1389k -f2(el valor predeterminado) da 9 y -f3da 8. For 1388k -f1da 9 y -f2da 8.


Mi banco de pruebas:

  • Debian GNU/Linux 9
  • mkfs.vfatcomo enlace simbólico amkfs.fat
  • mkfs.fatversión: 4.1 (2017-01-24)

Referencias:

  1. El sistema de archivos FATpor Andries Brouwer
    (Es de 2002 pero no creo que FAT12 haya cambiado significativamente desde entonces)
  2. Diseño del sistema de archivos FAT.en Wikipedia

información relacionada