Estructura del sector de arranque (Boot Sector) y BPB
La siguiente es la captura de los primeros 512 bytes de un diskette de 3.5 formateado con WinXP:
(http://www.ucontrol.com.ar/Articulos/fataldesnudo/floppyPrimerSector.gif)
Campo: BS_jmpBoot
Offset (Byte): 0
Tamaño (Bytes) : 3
Descripcion: Instrucción de salto al código de arranque. Este campo tiene una de las siguientes formas:
jmpBoot[0] = 0xEB, jmpBoot[1] = 0x??, jmpBoot[2] = 0x90
o
jmpBoot[0] = 0xE9, jmpBoot[1] = 0x??, jmpBoot[2] = 0x??
0x?? significa que esta permitido cualquier valor de 8 bits. Estos tres bytes componen una instrucción de salto incondicional Intel x86 (jump) que apunta al inicio del código de arranque del sistema operativo. Generalmente, este código ocupa el resto del espacio siguiente al BPB en el sector de arranque, posiblemente otros sectores. Cualquiera de las dos formas son aceptadas, pero JmpBoot[0] = 0xEB es el formato mas frecuentemente utilizado.
En nuestro ejemplo, encontramos los bytes “EB 3C 90” , lo que significa que se trata de la primera de las alternativas.
Campo: BS_OEMName
Offset (Byte): 3
Tamaño (Bytes) : 8
Descripcion: Generalmente se trata de la cadena “MSWIN4.1”. Existe todo un folclore acerca de la función de este campo, pero solo se trata de una cadena de texto. Los sistemas operativos de Microsoft no prestan ninguna atención a su contenido. Algunos drivers si lo hacen, por ese motivo se recomienda el valor “MSWIN4.1”, de manera de evitar incompatibilidades. El implementador es libre de cambiar esta cadena por cualquier otra, pero puede ocurrir que algún driver en particular no reconozca la unidad. Generalmente se toma como una indicación de que la unidad esta formateada.
El diskette formatedo con Windows XP contiene los bytes “4D 53 44 4F 53 35 2E 30”, que corresponden a los carcteres “MSDOS5.0”.
Campo: BPB_BytsPerSec
Offset (Byte): 11
Tamaño (Bytes) : 2
Descripcion: Número de bytes por sector. Puede tomar alguno de los valores siguientes: 512, 1024, 2048 o 4096. Si buscamos el máximo de compatibilidad con sistemas antiguos, debemos utilizar el valor 512. Existen muchos equipos viejos que manejan FAT de 512 bytes por sector por hard (“hard wired”) y no chequean este campo para determinar el número correcto de bytes de cada sector. Todos los sistemas operativos de Microsoft aceptan 1024, 2048, y 4096.
Siguiendo con el analisis del diskette, nos encontramos con los bytes “00 02”. Como mencionamos antes, al estar en formato “little indian”, el byte mas significativo es el ultimo, por lo que debemos interpretarlo como “02 00” (hexadecima), que corresponde al binario 0000 0010 0000 0000 o al decimal 512. Nuestro diskette contiene 512 bytes por sector.
Campo: BPB_SecPerClus
Offset (Byte): 13
Tamaño (Bytes) : 1
Descripcion: Numero de sectores por cluster. Este valor debe ser una potencia de 2 mayor a 0. Los valores permitidos son 1, 2, 4, 8, 16, 32, 64, y 128. Hay que destacar que nunca se debe utilizar un valor que multiplicado por BPB_BytsPerSec de un resultado mayor a 32K (BPB_BytsPerSec * BPB_SecPerClus 32 * 1024).
Es un error pensar que valores mayores son correctos. Si se eligen valores cuyo resultado sea superior a 32K muchis sistemas no funcionaran de forma correcta. Algunos sistemas permiten valores de 64K por cluster, pero no funcionan adecuadamente como volúmenes FAT.
En el ejemplo anterior, este byte es “01”, por lo que nuestro diskete contiene 1 sector por cluster. BPB_BytsPerSec * BPB_SecPerClus 32 * 1024 nos da un valor de 2 * 1 * 1024 = 2048, que es valido, por ser menor que 32K (32768).