Compartir a través de


Especificación del sistema de archivos exFAT

1 Introducción

El sistema de archivos exFAT es el sucesor de FAT32 en la familia FAT de sistemas de archivos. Esta especificación describe el sistema de archivos exFAT y proporciona toda la información necesaria para implementar el sistema de archivos exFAT.

1.1 Objetivos de diseño

El sistema de archivos exFAT tiene tres objetivos de diseño centrales (consulte la lista siguiente).

  1. Conserve la simplicidad de los sistemas de archivos basados en FAT.

    Dos de los puntos fuertes de los sistemas de archivos basados en FAT son su simplicidad relativa y facilidad de implementación. En el espíritu de sus predecesores, los implementadores deben encontrar exFAT relativamente simple y fácil de implementar.

  2. Habilite archivos y dispositivos de almacenamiento muy grandes.

    El sistema de archivos exFAT usa 64 bits para describir el tamaño de archivo, lo que permite a las aplicaciones que dependen de archivos muy grandes. El sistema de archivos exFAT también permite clústeres de hasta 32 MB, lo que permite de forma eficaz dispositivos de almacenamiento muy grandes.

  3. Incorporar extensibilidad de cara a la innovación futura.

    El sistema de archivos exFAT incorpora extensibilidad en su diseño, lo que permite que el sistema de archivos siga el ritmo de las innovaciones en el almacenamiento y los cambios en el uso.

1.2 Terminología específica

En el contexto de esta especificación, ciertos términos (véase la tabla 1) llevan un significado específico para el diseño y la implementación del sistema de archivos exFAT.

Tabla 1 Definición de términos que llevan un significado muy específico

término Definición
Deberá Esta especificación usa el término "debe" para describir un comportamiento que es obligatorio.
Debería Esta especificación usa el término "should" para describir un comportamiento que recomienda encarecidamente, pero no hace obligatorio.
Mayo Esta especificación usa el término "may" para describir un comportamiento que es opcional.
Obligatorio Este término describe un campo o estructura que una implementación modificará e interpretará como se describe en esta especificación.
Opcional Este término describe un campo o estructura que una implementación puede admitir o no. Si una implementación admite un determinado campo o estructura opcional, modificará e interpretará el campo o la estructura como se describe en esta especificación.
Indefinido Este término describe el contenido del campo o de la estructura que una implementación puede modificar según sea necesario (es decir, claro a cero al establecer campos o estructuras circundantes) y no interpretará para contener ningún significado específico.
Reservado

Este término describe el contenido de un campo o estructura que implementan:

  1. Se inicializará en cero y no se debe usar para ningún propósito

  2. No debe interpretar, excepto cuando se calculan sumas de comprobación

  3. Se conservará en todas las operaciones que modifiquen los campos o estructuras circundantes.

1.3 Texto completo de acrónimos comunes

Esta especificación usa acrónimos en uso común en el sector del equipo personal (consulte la tabla 2).

Tabla 2 Texto completo de acrónimos comunes

Acrónimo Texto completo
ASCII Código estándar estadounidense para intercambio de información
BIOS Sistema básico de salida de entrada
Unidad Central de Procesamiento (CPU) Unidad de procesamiento central
exFAT Tabla extensible de asignación de archivos
GORDO Tabla de asignación de archivos
FAT12 Tabla de asignación de archivos, índices de clúster de 12 bits
FAT16 Tabla de asignación de archivos, índices de clúster de 16 bits
FAT32 Tabla de asignación de archivos, índices de clúster de 32 bits
GPT (en inglés) Tabla de particiones GUID
Identificador Único Global (GUID) Identificador único global (consulte la sección 10.1)
INT Interrumpir
MBR Registro de arranque maestro
texFAT ExFAT seguro para transacciones
Tiempo Universal Coordinado (UTC) Hora universal coordinada

1.4 Calificadores de campo y estructura predeterminados

Los campos y las estructuras de esta especificación tienen los siguientes calificadores (vea la lista siguiente), a menos que la especificación tenga en cuenta lo contrario.

  1. No están firmados

  2. Use notación decimal para describir valores, donde no se indique lo contrario; esta especificación usa la letra "h" como sufijo para denotar números hexadecimales y encierra los GUIDs en llaves.

  3. Están en formato little-endian

  4. No requiere un carácter de terminación NULL para las cadenas

1.5 Windows CE y TexFAT

TexFAT es una extensión de exFAT que agrega semántica operativa segura para transacciones sobre el sistema de archivos base. Windows CE usa TexFAT. TexFAT requiere el uso de las dos FTS y mapas de bits de asignación para su uso en transacciones. También define varias estructuras adicionales, como descriptores de relleno y descriptores de seguridad.

Estructura de 2 Volúmenes

Un volumen es el conjunto de todas las estructuras del sistema de archivos y el espacio de datos necesario para almacenar y recuperar datos de usuario. Todos los volúmenes exFAT contienen cuatro regiones (vea la tabla 3).

Estructura de volumen de la tabla 3

Nombre de la subregión

de desplazamiento

(sector)

Tamaño

(sectores)

Comentarios
Región de arranque principal
Sector principal de arranque 0 1 Esta subregión es obligatoria y la sección 3.1 define su contenido.
Principales sectores de arranque extendidos 1 8 Esta subregión es obligatoria y la sección 3.2) define su contenido.
Parámetros principales de OEM 9 1 Esta subregión es obligatoria y la sección 3.3 define su contenido.
Reservado Principal 10 1 Esta subregión es obligatoria y su contenido está reservado.
Suma de comprobación de arranque principal 11 1 Esta subregión es obligatoria y la sección 3.4 define su contenido.
Región de arranque de copia de seguridad
Sector de arranque de copia de seguridad 12 1 Esta subregión es obligatoria y la sección 3.1 define su contenido.
Copia de seguridad de los sectores de arranque extendidos 13 8 Esta subregión es obligatoria y la sección 3.2 define su contenido.
Parámetros de OEM de copia de seguridad Veintiuno 1 Esta subregión es obligatoria y la sección 3.3 define su contenido.
Copia de seguridad reservada 22 1 Esta subregión es obligatoria y su contenido está reservado.
Suma de comprobación de copia de seguridad de arranque 23 1 Esta subregión es obligatoria y la sección 3.4 define su contenido.
Región FAT
Alineación FAT veinticuatro FatOffset – 24

Esta subregión es obligatoria y su contenido, si existe, no está definido.

Nota: Los sectores principal y de arranque de copia de seguridad contienen el campo FatOffset.

Primer FAT FatOffset FatLength

Esta subregión es obligatoria y la sección 4.1 define su contenido.

Nota: Los sectores principal y de arranque de copia de seguridad contienen los campos FatOffset y FatLength.

Segundo FAT DesplazamientoGrasa + LongitudGrasa LongitudGrasa * (NúmeroDeGrasas – 1)

Esta subregión es obligatoria y la sección 4.1 define su contenido, si existe.

Nota: los sectores principal y de arranque de copia de seguridad contienen los campos FatOffset, FatLength y NumberOfFats. El campo NumberOfFats solo puede contener valores 1 y 2.

Región de datos
Alineación del montón del clúster DesplazamientoDeGrasa + LongitudDeGrasa * NúmeroDeGrasas ClusterHeapOffset: (FatOffset + FatLength * NumberOfFats)

Esta subregión es obligatoria y su contenido, si existe, no está definido.

Nota: Los sectores principal y de arranque de copia de seguridad contienen los campos FatOffset, FatLength, NumberOfFats y ClusterHeapOffset. Los valores válidos del campo NumberOfFats son 1 y 2.

Montón de clústeres ClusterHeapOffset ClusterCount * 2SectoresPerClusterShift

Esta subregión es obligatoria y la sección 5.1 define su contenido.

Nota: Los sectores principal y de arranque de copia de seguridad contienen los campos ClusterHeapOffset, ClusterCount y SectorsPerClusterShift.

Exceso de espacio ClusterHeapOffset + ClusterCount * 2SectoresPerClusterShift LongitudDelVolumen: (ClusterHeapOffset + ClusterCount * 2SectoresPorDesplazamientoDeClúster)

Esta subregión es obligatoria y su contenido, si existe, no está definido.

Nota: Los sectores principal y de arranque de copia de seguridad contienen los campos ClusterHeapOffset, ClusterCount, SectorsPerClusterShift y VolumeLength.

3 Regiones de arranque principal y de copia de seguridad

La región de arranque principal proporciona todas las instrucciones necesarias para la configuración de arranque, la información de identificación y los parámetros del sistema de archivos para habilitar que una implementación lleve a cabo lo siguiente:

  1. Arrancar un sistema informático desde un volumen exFAT.
  2. Identifique el sistema de archivos en el volumen como exFAT.
  3. Descubra la ubicación de las estructuras del sistema de archivos exFAT.

La región de arranque de respaldo es un respaldo de la región de arranque principal. Ayuda a la recuperación del volumen exFAT en caso de que la región de arranque principal esté en un estado inconsistente. Excepto en circunstancias poco frecuentes, como actualizar instrucciones de arranque inicial, las implementaciones no deben modificar el contenido de la región de arranque de copia de seguridad.

3.1 Subregiones del sector de arranque principal y de copia de seguridad

El sector de arranque principal contiene código para el salto de arranque desde un volumen exFAT y parámetros exFAT fundamentales que describen la estructura del volumen (consulte la tabla 4). BIOS, MBR u otros agentes de carga de arranque pueden inspeccionar este sector y cargar y ejecutar las instrucciones de arranque contenidas en él.

El sector de arranque de copia de seguridad es una copia de seguridad del sector de arranque principal y tiene la misma estructura (consulte la tabla 4). El sector de arranque de copia de seguridad puede ayudar a las operaciones de recuperación; sin embargo, las implementaciones tratarán el contenido de los campos VolumeFlags y PercentInUse como obsoletos.

Antes de usar el contenido del sector principal o de arranque de copia de seguridad, las implementaciones comprobarán su contenido validando la suma de comprobación de arranque correspondiente y asegurándose de que todos sus campos están dentro de su intervalo de valores válido.

Aunque la operación de formato inicial inicial inicializará el contenido de los sectores principal y de arranque de copia de seguridad, las implementaciones pueden actualizar estos sectores (y también actualizarán su suma de comprobación de arranque correspondiente) según sea necesario. Sin embargo, las implementaciones pueden actualizar los campos VolumeFlags o PercentInUse sin actualizar su suma de comprobación de arranque respectiva (la suma de comprobación excluye específicamente estos dos campos).

Tabla 4 Estructura del sector de arranque principal y de respaldo

Nombre del campo

de desplazamiento

(byte)

Tamaño

(bytes)

Comentarios
JumpBoot 0 3 Este campo es obligatorio y la sección 3.1.1 define su contenido.
NombreDelSistemaDeArchivos 3 8 Este campo es obligatorio y la sección 3.1.2 define su contenido.
MustBeZero 11 53 Este campo es obligatorio y la sección 3.1.3 define su contenido.
Desplazamiento de Partición 64 8 Este campo es obligatorio y la sección 3.1.4 define su contenido.
Longitud del Volumen 72 8 Este campo es obligatorio y la sección 3.1.5 define su contenido.
FatOffset 80 4 Este campo es obligatorio y la sección 3.1.6 define su contenido.
FatLength 84 4 Este campo es obligatorio y la sección 3.1.7 define su contenido.
ClusterHeapOffset 88 4 Este campo es obligatorio y la sección 3.1.8 define su contenido.
Contador de Clústeres 92 4 Este campo es obligatorio y la sección 3.1.9 define su contenido.
FirstClusterOfRootDirectory 96 4 Este campo es obligatorio y la sección 3.1.10 define su contenido.
Número de serie del volumen 100 4 Este campo es obligatorio y la sección 3.1.11 define su contenido.
Revisión del Sistema de Archivos 104 2 Este campo es obligatorio y la sección 3.1.12 define su contenido.
VolumeFlags 106 2 Este campo es obligatorio y la sección 3.1.13 define su contenido.
DesplazamientoDeBytesPorSector 108 1 Este campo es obligatorio y la sección 3.1.14 define su contenido.
DesplazamientoDeSectoresPorCluster 109 1 Este campo es obligatorio y la sección 3.1.15 define su contenido.
NumberOfFats 110 1 Este campo es obligatorio y la sección 3.1.16 define su contenido.
DriveSelect 111 1 Este campo es obligatorio y la sección 3.1.17 define su contenido.
PorcentajeEnUso 112 1 Este campo es obligatorio y la sección 3.1.18 define su contenido.
Reservado 113 7 Este campo es obligatorio y su contenido está reservado.
Código de Arranque 120 390 Este campo es obligatorio y la sección 3.1.19 define su contenido.
BootSignature 510 2 Este campo es obligatorio y la sección 3.1.20 define su contenido.
ExcessSpace 512 2BytesPerSectorShift : 512

Este campo es obligatorio y su contenido, si existe, no están definidos.

Nota: los sectores principal y de arranque de copia de seguridad contienen el campo BytesPerSectorShift.

3.1.1 Campo JumpBoot

El campo JumpBoot contendrá la instrucción de salto para las CPU comunes en equipos personales, que, cuando se ejecuta, "salta" la CPU para ejecutar las instrucciones de salto de arranque en el campo BootCode.

El valor válido para este campo es (en orden de byte de orden bajo a byte de orden alto) EBh 76h 90h.

3.1.2 Campo FileSystemName

El campo FileSystemName contendrá el nombre del sistema de archivos en el volumen.

El valor válido para este campo es, en caracteres ASCII, "EXFAT", que incluye tres espacios en blanco finales.

3.1.3 Campo MustBeZero

El campo MustBeZero se corresponde directamente con el intervalo de bytes que consume el bloque de parámetros BIOS empaquetado en volúmenes FAT12/16/32.

El valor válido para este campo es 0, lo que ayuda a evitar que las implementaciones FAT12/16/32 monten erróneamente un volumen exFAT.

3.1.4 PartitionOffset (campo)

El campo PartitionOffset describirá el desplazamiento del sector relativo al medio de la partición que hospeda el volumen exFAT especificado. Este campo ayuda a arrastrar el arranque desde el volumen mediante INT 13h extendido en equipos personales.

Todos los valores posibles para este campo son válidos; sin embargo, el valor 0 indica que las implementaciones omitirán este campo.

3.1.5 Campo VolumeLength

El campo VolumeLength describirá el tamaño del volumen exFAT especificado en sectores.

El intervalo válido de valores para este campo será:

  • Al menos2 20/ 2BytesPerSectorShift, lo que garantiza que el volumen más pequeño no sea inferior a 1 MB.

  • Como máximo 264- 1, el valor más grande que puede describir este campo.

    Sin embargo, si el tamaño de la subregión de Espacio Excesivo es 0, el valor más grande de este campo es ClusterHeapOffset + (232- 11) *2SectorsPerClusterShift.

3.1.6 Campo FatOffset

El campo FatOffset describirá el desplazamiento del sector relativo al volumen del Primer FAT. Este campo permite que las implementaciones alineen first FAT con las características del medio de almacenamiento subyacente.

El intervalo válido de valores para este campo será:

  • Al menos 24, teniendo en cuenta los sectores que consumen las regiones de arranque principal y de arranque de copia de seguridad
  • A lo sumo ClusterHeapOffset - (FatLength * NumberOfFats), que representa los sectores que consume el área de clústeres

3.1.7 Campo FatLength

El campo FatLength describirá la longitud, en sectores, de cada tabla FAT (el volumen puede contener hasta dos FAT).

El intervalo válido de valores para este campo será:

  • Al menos (ClusterCount + 2) *2 2/ 2BytesPerSectorShiftredondeado hasta el entero más cercano, lo que garantiza que cada FAT tenga espacio suficiente para describir todos los clústeres del montón de clústeres.
  • Como máximo (ClusterHeapOffset - FatOffset) / NumberOfFats redondeados hacia abajo hasta el entero más cercano, lo que garantiza que existen las FT antes del montón de clústeres.

Este campo puede contener un valor superior a su límite inferior (como se ha descrito anteriormente) para permitir que el Segundo FAT, si está presente, también se alinee con las características del medio de almacenamiento subyacente. El contenido del espacio que supera lo que requiere el propio FAT, si existe, no está definido.

3.1.8 Campo ClusterHeapOffset

El campo ClusterHeapOffset describirá el desplazamiento del sector relativo al volumen del montón del clúster. Este campo permite a las implementaciones alinear el montón de clústeres con las características del medio de almacenamiento subyacente.

El intervalo válido de valores para este campo será:

  • Al menos FatOffset + FatLength * NumberOfFats, para tener en cuenta los sectores que consumen todas las regiones anteriores
  • Como máximo 232 - 1 o VolumeLength - (ClusterCount * 2SectoresPerClusterShift), lo que resulte en el cálculo menor.

3.1.9 Campo ClusterCount

El campo ClusterCount describirá el número de clústeres que contiene el montón de clústeres.

El valor válido para este campo será el menor de lo siguiente:

  • (VolumeLength - ClusterHeapOffset) / 2SectoresPerClusterShiftredondeado hacia abajo hasta el entero más cercano, que es exactamente el número de clústeres que pueden caber entre el principio del montón del clúster y el final del volumen.
  • 232- 11, que es el número máximo de clústeres que un FAT puede describir

El valor del campo ClusterCount determina el tamaño mínimo de un FAT. Para evitar FATs extremadamente grandes, las implementaciones pueden controlar el número de clústeres en la acumulación de clústeres aumentando el tamaño del clúster (a través del campo SectoresPerClusterShift). Esta especificación no recomienda más de2 clústeres de 24 a 2 en el montón de clústeres. Sin embargo, las implementaciones deberán ser capaces de manejar volúmenes con hasta 2^32 - 11 clústeres en el montón de clústeres.

3.1.10 Campo Primer Clúster del Directorio Raíz

El campo FirstClusterOfRootDirectory contendrá el índice de clúster del primer clúster del directorio raíz. Las implementaciones deben hacer todo lo posible para colocar el primer clúster del directorio raíz en el primer clúster no incorrecto después de los clústeres que consume el mapa de bits de asignación y la tabla de mayúsculas y minúsculas.

El intervalo válido de valores para este campo será:

  • Al menos 2, el índice del primer clúster del montón de clústeres
  • Como máximo ClusterCount + 1, el índice del último clúster del montón de clústeres

3.1.11 VolumeSerialNumber (campo)

El campo VolumeSerialNumber contendrá un número de serie único. Esto ayuda a las implementaciones a distinguir entre diferentes volúmenes exFAT. Las implementaciones deben generar el número de serie combinando la fecha y hora de dar formato al volumen exFAT. El mecanismo para combinar fecha y hora para formar un número de serie es específico de la implementación.

Todos los valores posibles para este campo son válidos.

3.1.12 Campo FileSystemRevision

El campo FileSystemRevision describirá los números de revisión principales y menores de las estructuras exFAT en el volumen especificado.

El byte de orden alto es el número de revisión principal y el byte de orden bajo es el número de revisión menor. Por ejemplo, si el byte de orden superior contiene el valor 01h y si el byte de orden bajo contiene el valor 05h, el campo FileSystemRevision describe el número de revisión 1.05. Del mismo modo, si el byte de orden superior contiene el valor 0Ah y si el byte de orden bajo contiene el valor 0Fh, el campo FileSystemRevision describe el número de revisión 10.15.

El intervalo válido de valores para este campo será:

  • Al menos 0 para el byte de orden bajo y 1 para el byte de orden superior
  • Como máximo, 99 para el byte de orden bajo y 99 para el byte de orden superior

El número de revisión de exFAT que describe esta especificación es 1.00. Las implementaciones de esta especificación deben montar cualquier volumen exFAT con el número de revisión mayor 1 y no montarán ningún volumen exFAT con ningún otro número de revisión principal. Las implementaciones respetarán el número de revisión menor y no realizarán operaciones ni crearán ninguna estructura del sistema de archivos que no se describa en la especificación correspondiente del número de revisión menor especificado.

3.1.13 Campo VolumeFlags

El campo VolumeFlags contendrá marcas que indican el estado de varias estructuras del sistema de archivos en el volumen exFAT (véase la tabla 5).

Las implementaciones no incluirán este campo al calcular su correspondiente suma de comprobación de la región de arranque principal o de arranque de copia de seguridad. Al hacer referencia al sector de arranque de copia de seguridad, las implementaciones tratarán este campo como obsoleto.

Tabla 5 Estructura del campo VolumeFlags

Nombre del campo

de desplazamiento

(bit)

Tamaño

(bits)

Comentarios
ActiveFat 0 1 Este campo es obligatorio y la sección 3.1.13.1 define su contenido.
VolumenSucio 1 1 Este campo es obligatorio y la sección 3.1.13.2 define su contenido.
Fallo de medios 2 1 Este campo es obligatorio y la sección 3.1.13.3 define su contenido.
ClearToZero 3 1 Este campo es obligatorio y la sección 3.1.13.4 define su contenido.
Reservado 4 12 Este campo es obligatorio y su contenido está reservado.
3.1.13.1 Campo ActiveFat

El campo ActiveFat describirá qué FAT y qué mapa de bits de asignación están activos (que deben usar las implementaciones), como se indica a continuación:

  • 0, lo que significa que la Primera FAT y el mapa de bits de primera asignación están activos
  • 1, lo que significa que el FAT secundario y el segundo mapa de bits de asignación están activos y solo es posible cuando el campo NumberOfFats contiene el valor 2

Las implementaciones tendrán en cuenta el FAT inactivo y el mapa de bits de asignación como obsoletos. Solo las implementaciones compatibles con TexFAT cambiarán los mapas de bits fat y de asignación activos (consulte la sección 7.1).

3.1.13.2 Campo VolumeDirty

El campo VolumeDirty describirá si el volumen está sucio o no, como se indica a continuación:

  • 0, lo que significa que el volumen probablemente está en un estado coherente
  • 1, lo que significa que el volumen probablemente está en un estado incoherente

Las implementaciones deben establecer el valor de este campo en 1 al encontrar incoherencias de metadatos del sistema de archivos que no resuelven. Si, al montar un volumen, el valor de este campo es 1, solo las implementaciones que resuelven incoherencias de metadatos del sistema de archivos pueden borrar el valor de este campo en 0. Estas implementaciones solo borrarán el valor de este campo en 0 después de garantizar que el sistema de archivos esté en un estado coherente.

Si, al montar un volumen, el valor de este campo es 0, las implementaciones deben establecer este campo en 1 antes de actualizar los metadatos del sistema de archivos y borrar este campo en 0 después, similar al orden de escritura recomendado descrito en la sección 8.1.

3.1.13.3 Campo MediaFailure

El campo MediaFailure describirá si una implementación ha detectado errores multimedia o no, como se indica a continuación:

  • 0, lo que significa que los medios de alojamiento no han informado fallos o que los fallos conocidos ya se han registrado en el FAT como clústeres "defectuosos".
  • 1, lo que significa que el medio de hospedaje ha notificado errores (es decir, ha producido errores en las operaciones de lectura o escritura).

Una implementación debe establecer este campo en 1 cuando:

  1. El medio de hospedaje falla en los intentos de acceso a cualquier área del volumen.
  2. La implementación ha agotado los algoritmos de reintento de acceso, si los hay.

Si, al montar un volumen, el valor de este campo es 1, las implementaciones que examinan todo el volumen de errores multimedia y registran todos los errores como clústeres "incorrectos" en FAT (o, de lo contrario, resolver errores multimedia) pueden borrar el valor de este campo en 0.

3.1.13.4 Campo ClearToZero

El campo ClearToZero no tiene un significado significativo en esta especificación.

Los valores válidos para este campo son:

  • 0, que no tiene ningún significado particular
  • 1, lo que significa que las implementaciones borrarán este campo a 0 antes de modificar las estructuras, directorios o archivos del sistema de archivos.

Campo 3.1.14 BytesPerSectorShift

El campo BytesPerSectorShift describirá los bytes por sector expresados como log2(N), donde N es el número de bytes por sector. Por ejemplo, para 512 bytes por sector, el valor de este campo es 9.

El intervalo válido de valores para este campo será:

  • Al menos 9 (tamaño de sector de 512 bytes), que es el sector más pequeño posible para un volumen exFAT
  • Como máximo 12 (tamaño de sector de 4096 bytes), que es el tamaño de página de memoria de las CPU comunes en los equipos personales

3.1.15 SectoresPerClusterShift

El campo SectoresPerClusterShift describirá los sectores por clúster expresados en forma de logaritmo base 2(N), donde N es el número de sectores por clúster. Por ejemplo, para 8 sectores por clúster, el valor de este campo es 3.

El intervalo válido de valores para este campo será:

  • Al menos 0 (1 sector por clúster), que es el clúster más pequeño posible
  • Como máximo, 25 - BytesPerSectorShift, lo que se calcula como un tamaño de clúster de 32 MB

3.1.16 Campo NumberOfFats

El campo NumberOfFats describirá el número de FATs y mapas de bits de asignación que el volumen contiene.

El intervalo válido de valores para este campo será:

  • 1, que indica que el volumen solo contiene el First FAT y el First Allocation Bitmap.
  • 2, que indica que el volumen contiene el Primer FAT, Segundo FAT, Primer mapa de bits de asignación y Segundo mapa de bits de asignación; este valor solo es válido para volúmenes de TexFAT.

3.1.17 Campo DriveSelect

El campo DriveSelect deberá contener el número de unidad INT 13h extendido, que facilita el arranque de este volumen mediante INT 13h extendido en ordenadores personales.

Todos los valores posibles para este campo son válidos. Los campos similares de los sistemas de archivos basados en FAT anteriores contenían con frecuencia el valor 80h.

3.1.18 Campo PorcentajeEnUso

El campo PercentInUse describirá el porcentaje de clústeres del montón de clústeres que se asignan.

El intervalo válido de valores para este campo será:

  • Entre 0 y 100 inclusive, que es el porcentaje de clústeres asignados en el montón de clústeres, redondeado hacia abajo hasta el entero más cercano.
  • FFh exactamente, que indica el porcentaje de clústeres asignados en el montón de clústeres no está disponible.

Las implementaciones deberán cambiar el valor de este campo para reflejar los cambios en la asignación de clústeres en la pila de clústeres o deberán cambiarlo a FFh.

Las implementaciones no incluirán este campo al calcular su correspondiente suma de comprobación de la región de arranque principal o de arranque de copia de seguridad. Al hacer referencia al sector de arranque de copia de seguridad, las implementaciones tratarán este campo como obsoleto.

3.1.19 Campo BootCode

El campo BootCode contendrá instrucciones de salto de arranque. Las implementaciones pueden rellenar este campo con las instrucciones de CPU necesarias para el arranque de un sistema informático. Las implementaciones que no proporcionan instrucciones de autoinicialización deberán inicializar cada byte de este campo a F4h (la instrucción de detención para CPUs comunes en PCs personales) como parte de su operación de formato.

3.1.20 Campo BootSignature

El campo BootSignature describirá si la intención de un sector determinado es que sea un sector de arranque o no.

El valor válido para este campo es AA55h. Cualquier otro valor en este campo invalida el sector de arranque correspondiente. Las implementaciones deben verificar el contenido de este campo antes de depender de cualquier otro campo en su respectivo sector de arranque.

3.2 Sectores de arranque extendido principales y de respaldo subregiones

Cada sector de los sectores de arranque principales extendidos tiene la misma estructura; sin embargo, cada sector puede contener instrucciones de arranque distintas (consulte la tabla 6). Los agentes de arranque, como las instrucciones de arranque en el sector de arranque principal, las implementaciones alternativas del BIOS o el firmware de un sistema embebido, pueden cargar estos sectores y ejecutar las instrucciones que contienen.

Los sectores de arranque extendido de copia de seguridad son una copia de seguridad de los sectores principales de arranque extendido y tienen la misma estructura (consulte la tabla 6).

Antes de ejecutar las instrucciones de los sectores principal o de arranque extendido de copia de seguridad, las implementaciones deben comprobar su contenido asegurándose de que el campo ExtendedBootSignature de cada sector contenga su valor prescrito.

Aunque la operación de formato inicializará el contenido de los sectores de arranque principal y extendido de copia de seguridad, las implementaciones pueden actualizar estos sectores (y también actualizarán la suma de comprobación de arranque correspondiente) según sea necesario.

Tabla 6 Estructura del sector de arranque extendido

Nombre del campo

de desplazamiento

(byte)

Tamaño

(bytes)

Comentarios
Código de Inicio Extendido 0 2BytesPerSectorShift : 4

Este campo es obligatorio y la sección 3.2.1 define su contenido.

Nota: los sectores principal y de arranque de copia de seguridad contienen el campo BytesPerSectorShift.

FirmaDeArranqueExtendida 2BytesPerSectorShift : 4 4

Este campo es obligatorio y la sección 3.2.2 define su contenido.

Nota: los sectores principal y de arranque de copia de seguridad contienen el campo BytesPerSectorShift.

3.2.1 Campo CódigoExtendidoDeArranque

El campo ExtendedBootCode contendrá instrucciones de arranque. Las implementaciones pueden rellenar este campo con las instrucciones de CPU necesarias para el arranque de un sistema informático. Las implementaciones que no proporcionan instrucciones de arranque inicializarán cada byte de este campo a 00h como parte de su operación de formato.

3.2.2 Campo ExtendedBootSignature

El campo "ExtendedBootSignature" describirá si la intención del sector dado es que sea un "Sector de Arranque Extendido" o no.

El valor válido para este campo es AA550000h. Cualquier otro valor en este campo invalida su respectivo Sector de arranque principal o Sector de arranque extendido de respaldo. Las implementaciones deben verificar el contenido de este campo antes de depender de cualquier otro campo en su sector de arranque extendido respectivo.

3.3 Subregiones principales y de copia de seguridad de parámetros OEM

La subregión Parámetros principales del OEM contiene diez estructuras de parámetros que pueden contener información específica del fabricante (consulte la tabla 7). Cada una de las diez estructuras de parámetros deriva de la plantilla Parámetros genéricos (consulte la sección 3.3.2). Los fabricantes pueden derivar sus propias estructuras de parámetros personalizados de la plantilla Parámetros genéricos. Esta propia especificación define dos estructuras de parámetros: Parámetros NULL (consulte sección 3.3.3) y Parámetros flash (consulte la sección 3.3.4).

Los Parámetros OEM de Respaldo son un respaldo de los Parámetros Principales del OEM y tienen la misma estructura (consulte Tabla 7).

Antes de usar el contenido de los parámetros oem principal o de copia de seguridad, las implementaciones comprobarán su contenido validando la suma de comprobación de arranque correspondiente.

Los fabricantes deben rellenar los parámetros oem main y backup con sus propias estructuras de parámetros personalizados, si las hay, y cualquier otra estructura de parámetros. Las operaciones de formato posteriores conservarán el contenido de los Parámetros OEM de Main y Backup.

Las implementaciones pueden actualizar los Parámetros OEM principales y de copia de seguridad cuando sea necesario (y también actualizarán la suma de comprobación de arranque correspondiente).

Tabla 7 Estructura de parámetros de OEM

Nombre del campo

de desplazamiento

(byte)

Tamaño

(bytes)

Comentarios
Parámetros[0] 0 48 Este campo es obligatorio y la sección 3.3.1 define su contenido.

.

.

.

.

.

.

.

.

.

.

.

.

Parámetros[9] 432 48 Este campo es obligatorio y la sección 3.3.1 define su contenido.
Reservado 480 2BytesPerSectorShift : 480

Este campo es obligatorio y su contenido está reservado.

Nota: los sectores principal y de arranque de copia de seguridad contienen el campo BytesPerSectorShift.

3.3.1 Parámetros[0] ... Parámetros[9]

Cada campo Parámetros de esta matriz contiene una estructura de parámetros, que se deriva de la plantilla Parámetros genéricos (consulte sección 3.3.2). Cualquier campo Parámetros sin usar se describirá como que contiene una estructura de parámetros NULL (consulte la sección 3.3.3).

Plantilla de parámetros genéricos 3.3.2

La plantilla Parámetros genéricos proporciona la definición base de una estructura de parámetros (vea la tabla 8). Todas las estructuras de parámetros derivan de esta plantilla. La compatibilidad con esta plantilla de parámetros genéricos es obligatoria.

Plantilla de parámetros genéricos de la tabla 8

Nombre del campo

de desplazamiento

(byte)

Tamaño

(bytes)

Comentarios
ParametersGuid 0 16 Este campo es obligatorio y la sección 3.3.2.1 define su contenido.
CustomDefined 16 32 Este campo es obligatorio y las estructuras que derivan de esta plantilla definen su contenido.
3.3.2.1 ParámetrosCampoGuid

El campo ParametersGuid describirá un GUID, que determina el diseño del resto de la estructura de parámetros especificada.

Todos los valores posibles para este campo son válidos; Sin embargo, los fabricantes deben usar una herramienta de generación de GUID, como GuidGen.exe, para seleccionar un GUID al derivar estructuras de parámetros personalizados de esta plantilla.

3.3.3 Parámetros NULL

La estructura Parámetros NULL se deriva de la plantilla Parámetros genéricos (consulte la sección 3.3.2) y describirá un campo Parámetros sin usar (vea la tabla 9). Al crear o actualizar la estructura parámetros de OEM, las implementaciones rellenarán los campos Parameters sin usar con la estructura Parámetros NULL. Además, al crear o actualizar la estructura parámetros de OEM, las implementaciones deben consolidar las estructuras de parámetros NULL al final de la matriz, dejando así todas las demás estructuras parameters al principio de la estructura de parámetros oem.

La compatibilidad con la estructura De parámetros NULL es obligatoria.

Tabla 9 Estructura de parámetros NULL

Nombre del campo

de desplazamiento

(byte)

Tamaño

(bytes)

Comentarios
Guía de Parámetros 0 16 Este campo es obligatorio y la sección 3.3.3.1 define su contenido.
Reservado 16 32 Este campo es obligatorio y su contenido está reservado.
3.3.3.1 ParámetrosCampoGuid

El campo ParametersGuid se ajustará a la definición proporcionada por la plantilla Parámetros genéricos (consulte la sección 3.3.2.1).

El valor válido para este campo, en notación GUID, es {00000000-0000-0000-0000-000000000000}.

3.3.4 Parámetros flash

La estructura de parámetros flash deriva de la plantilla Parámetros genéricos (consulte la sección 3.3.2) y contiene parámetros para medios flash (consulte la tabla 10). Los fabricantes de dispositivos de almacenamiento basados en flash pueden rellenar un campo Parámetros (preferiblemente el campo Parámetros[0] con esta estructura de parámetros. Las implementaciones pueden usar la información de la estructura De parámetros flash para optimizar las operaciones de acceso durante las lecturas y escrituras y para la alineación de las estructuras del sistema de archivos durante el formato del medio.

La compatibilidad con la estructura de parámetros flash es opcional.

Tabla 10 Estructura de parámetros flash

Nombre del campo

de desplazamiento

(byte)

Tamaño

(bytes)

Comentarios
ParametersGuid 0 16 Este campo es obligatorio y la sección 3.3.4.1 define su contenido.
TamañoDeBloqueDeBorrado 16 4 Este campo es obligatorio y la sección 3.3.4.2 define su contenido.
Pagesize 20 4 Este campo es obligatorio y la sección 3.3.4.3 define su contenido.
SpareSectors veinticuatro 4 Este campo es obligatorio y la sección 3.3.4.4 define su contenido.
Tiempo de Acceso Aleatorio 28 4 Este campo es obligatorio y la sección 3.3.4.5 define su contenido.
TiempoDeProgramación 32 4 Este campo es obligatorio y la sección 3.3.4.6 define su contenido.
ReadCycle 36 4 Este campo es obligatorio y la sección 3.3.4.7 define su contenido.
WriteCycle 40 4 Este campo es obligatorio y la sección 3.3.4.8 define su contenido.
Reservado 44 4 Este campo es obligatorio y su contenido está reservado.

Todos los valores posibles para todos los campos Parámetros de Flash, excepto para el campo ParametersGuid, son válidos. Sin embargo, el valor 0 indica que el campo no tiene sentido (las implementaciones omitirán el campo especificado).

3.3.4.1 Parámetros Campo Guid

El campo ParametersGuid se ajustará a la definición proporcionada en la plantilla Parámetros genéricos (consulte la sección 3.3.2.1).

El valor válido para este campo, en notación GUID, es {0A0C7E46-3399-4021-90C8-FA6D389C4BA2}.

3.3.4.2 Campo EraseBlockSize

El campo EraseBlockSize describirá el tamaño, en bytes, del bloque de borrado del medio flash.

3.3.4.3 Campo Tamaño de página

El campo PageSize describirá el tamaño, en bytes de la página del medio flash.

3.3.4.4 Campo SpareSectors

El campo SpareSectors debe describir el número de sectores que la memoria flash tiene disponible para sus operaciones internas de reserva.

3.3.4.5 Campo RandomAccessTime

El campo RandomAccessTime describirá el promedio de tiempo de acceso aleatorio del medio flash, en nanosegundos.

3.3.4.6 Campo Tiempo de Programación

El campo ProgrammingTime describirá el tiempo medio de programación de los medios flash, en nanosegundos.

3.3.4.7 Campo ReadCycle

El campo ReadCycle describirá el tiempo medio de lectura promedio del medio flash, en nanosegundos.

3.3.4.8 Campo WriteCycle

El campo WriteCycle describirá el tiempo medio del ciclo de escritura, en nanosegundos.

3.4 Sub-regiones de suma de comprobación de arranque principales y de copia de seguridad

Las sumas de comprobación de arranque principal y de respaldo contienen cada una un patrón repetitivo de la suma de comprobación de cuatro bytes del contenido de todas las demás sub-regiones en sus respectivas regiones de arranque. El cálculo de la suma de comprobación no incluirá los campos VolumeFlags y PercentInUse en su respectivo sector de arranque (consulte la figura 1). El patrón de repetición de la suma de comprobación de cuatro bytes rellena su subregión de suma de comprobación de arranque correspondiente desde el principio hasta el final de la subregión.

Antes de usar el contenido de cualquiera de las demás subregiones de las regiones Principal o de Respaldo de Arranque, las implementaciones comprobarán su contenido mediante la validación de su suma de comprobación de arranque respectiva.

Aunque la operación de formato inicial rellenará las sumas de comprobación principal y de arranque de copia de seguridad con el patrón de suma de comprobación repetida, las implementaciones actualizarán estos sectores a medida que cambie el contenido de los demás sectores de sus respectivas regiones de arranque.

Figura 1 Cálculo del checksum de arranque

UInt32 BootChecksum
(
    UCHAR  * Sectors,        // points to an in-memory copy of the 11 sectors
    USHORT   BytesPerSector
)
{
    UInt32 NumberOfBytes = (UInt32)BytesPerSector * 11;
    UInt32 Checksum = 0;
    UInt32 Index;

    for (Index = 0; Index < NumberOfBytes; Index++)
    {
        if ((Index == 106) || (Index == 107) || (Index == 112))
        {
            continue;
        }
        Checksum = ((Checksum&1) ? 0x80000000 : 0) + (Checksum>>1) + (UInt32)Sectors[Index];
    }

    return Checksum;
}

4 Región de la Tabla de Asignación de Archivos

La región Tabla de Asignación de Archivos (FAT) puede contener hasta dos FAT, uno en la subregión del Primer FAT y otro en la subregión del Segundo FAT. El campo NumberOfFats describe cuántos FAT contiene esta región. Los valores válidos para el campo NumberOfFats son 1 y 2. Por lo tanto, la subregión First FAT siempre contiene una FAT. Si el campo NumberOfFats es dos, la segunda subregión FAT también contiene una FAT.

El campo ActiveFat del campo VolumeFlags describe qué FAT está activo. Solo el campo VolumeFlags del sector de arranque principal es actual. Las implementaciones tratarán la FAT que no está activa como obsoleta. El uso de FAT inactiva y el cambio entre sistemas FAT es específico de la implementación.

4.1 Primera y Segunda Subregiones de FAT

Una FAT describirá las cadenas de clúster en el montón de clústeres (consulte la tabla 11). Una cadena de clústeres es una serie de clústeres que proporciona espacio para registrar el contenido de archivos, directorios y otras estructuras del sistema de archivos. Un FAT representa una cadena de clústeres como una lista enlazada singular de índices de clúster. Con la excepción de las dos primeras entradas, cada entrada de un FAT representa exactamente un clúster.

Tabla 11 Estructura de tabla de asignación de archivos

Nombre del campo

de desplazamiento

(byte)

Tamaño

(bytes)

Comentarios
FatEntry[0] 0 4 Este campo es obligatorio y la sección 4.1.1 define su contenido.
FatEntry[1] 4 4 Este campo es obligatorio y la sección 4.1.2 define su contenido.
FatEntry[2] 8 4 Este campo es obligatorio y la sección 4.1.3 define su contenido.

.

.

.

.

.

.

.

.

.

.

.

.

FatEntry[ClusterCount+1] (ClusterCount + 1) * 4 4

Este campo es obligatorio y la sección 4.1.3 define su contenido.

ClusterCount + 1 nunca puede superar FFFFFFF6h.

Nota: Los sectores principal y de arranque de copia de seguridad contienen el campo ClusterCount.

ExcessSpace (ClusterCount + 2) * 4 (FatLength * 2BytesPerSectorShift) – ((ClusterCount + 2) * 4)

Este campo es obligatorio y su contenido, si existe, no están definidos.

Nota: los sectores principal y de arranque de copia de seguridad contienen los campos ClusterCount, FatLength y BytesPerSectorShift.

4.1.1 FatEntry[0] Campo

El campo FatEntry[0] describirá el tipo de medio en el primer byte (el byte de orden más bajo) y contendrá FFh en los tres bytes restantes.

El tipo de medio (el primer byte) debe ser F8h.

4.1.2 FatEntry[1] Campo

El campo FatEntry[1] solo existe debido a la prioridad histórica y no describe nada de interés.

El valor válido para este campo es FFFFFFFFh. Las implementaciones inicializarán este campo en su valor prescrito y no deben usar este campo para ningún propósito. Las implementaciones no deben interpretar este campo y conservarán su contenido en todas las operaciones que modifiquen los campos circundantes.

4.1.3 FatEntry[2] ... FatEntry[ClusterCount+1] Fields

Cada campo FatEntry de esta matriz representará un clúster en el montón de clústeres. FatEntry[2] representa el primer clúster del montón de clústeres y FatEntry[ClusterCount+1] representa el último clúster del montón de clústeres.

El intervalo válido de valores para estos campos será:

  • Entre 2 y ClusterCount + 1, inclusive, que apunta al siguiente FatEntry en la cadena de clústeres especificada; el objeto FatEntry dado no señalará a fatEntry que lo precede en la cadena de clústeres dada.
  • Exactamente FFFFFFF7h, que marca el clúster correspondiente de FatEntry dado como "malo"
  • Exactamente FFFFFFFFh, que marca el clúster correspondiente de FatEntry dado como el último clúster de una cadena de clústeres; este es el único valor válido para la última fatEntry de cualquier cadena de clúster determinada.

5 Región de datos

La región Datos contiene el montón de clústeres, que proporciona espacio administrado para estructuras, directorios y archivos del sistema de archivos.

5.1 Subregión del montón de clústeres

La estructura del montón del clúster es muy sencilla (consulte la tabla 12); cada serie consecutiva de sectores describe un clúster, como define el campo SectorsPerClusterShift. Importantemente, el primer clúster del montón de clústeres tiene el índice dos, que corresponde directamente al índice de FatEntry[2].

En un volumen exFAT, un mapa de bits de asignación (consulte la sección 7.1.5) mantiene el registro del estado de asignación de todos los clústeres. Esta es una diferencia significativa de las predecesoras de exFAT (FAT12, FAT16 y FAT32), en las que un FAT mantuvo un registro del estado de asignación de todos los clústeres del montón de clústeres.

Tabla 12 Estructura del montón de clústeres

Nombre del campo

de desplazamiento

(sector)

Tamaño

(sectores)

Comentarios
Clúster[2] ClusterHeapOffset 2SectoresPerClusterShift

Este campo es obligatorio y la sección 5.1.1 define su contenido.

Nota: Los sectores principal y de arranque de copia de seguridad contienen los campos ClusterHeapOffset y SectorsPerClusterShift.

.

.

.

.

.

.

.

.

.

.

.

.

Cluster[ClusterCount+1] ClusterHeapOffset + (ClusterCount – 1) * 2SectoresPerClusterShift 2SectoresPerClusterShift

Este campo es obligatorio y la sección 5.1.1 define su contenido.

Nota: los sectores principal y de arranque de copia de seguridad contienen los campos ClusterCount, ClusterHeapOffset y SectorsPerClusterShift.

5.1.1 Clúster[2] ... Clúster[ClusterCount+1] Campos

Cada campo Clúster de esta matriz es una serie de sectores contiguos, cuyo tamaño se define mediante el campo SectoresPerClusterShift.

Estructura de directorios 6

El sistema de archivos exFAT usa un enfoque de árbol de directorios para administrar las estructuras y archivos del sistema de archivos que existen en el montón de clústeres. Los directorios tienen una relación uno a varios entre los elementos primarios y secundarios del árbol de directorios.

El directorio al que hace referencia el campo FirstClusterOfRootDirectory es la raíz del árbol de directorios. Todos los demás directorios descienden del directorio raíz de forma enlazada individualmente.

Cada directorio consta de una serie de entradas de directorio (vea la tabla 13).

Una o varias entradas de directorio se combinan en un conjunto de entradas de directorio que describe algo de interés, como una estructura del sistema de archivos, un subdirectorio o un archivo.

Tabla 13 Estructura de directorios

Nombre del campo

de desplazamiento

(byte)

Tamaño

(byte)

Comentarios
DirectoryEntry[0] 0 32 Este campo es obligatorio y la sección 6.1 define su contenido.

.

.

.

.

.

.

.

.

.

.

.

.

DirectoryEntry[N–1] (N – 1) * 32 32

Este campo es obligatorio y la sección 6.1 define su contenido.

N, el número de campos DirectoryEntry es el tamaño, en bytes, de la cadena de clústeres que contiene el directorio especificado, dividido por el tamaño de un campo DirectoryEntry, 32 bytes.

6.1 DirectoryEntry[0] ... DirectoryEntry[N--1]

Cada campo DirectoryEntry de esta matriz deriva de la plantilla DirectoryEntry genérica (consulte sección 6.2).

6.2 Plantilla genérica de entrada de directorio

La plantilla DirectoryEntry genérico proporciona la definición base para las entradas de directorio (vea la tabla 14). Todas las estructuras de entrada de directorio derivan de esta plantilla y solo las estructuras de entrada de directorio definidas por Microsoft son válidas (exFAT no tiene disposiciones para las estructuras de entrada de directorio definidas por el fabricante, excepto las definidas en la sección 7.8 y la sección 7.9). La capacidad de interpretar la plantilla Generic DirectoryEntry es obligatoria.

Tabla 14 Plantilla de DirectoryEntry genérica

Nombre del campo

de desplazamiento

(byte)

Tamaño

(byte)

Comentarios
Tipo de Entrada 0 1 Este campo es obligatorio y la sección 6.2.1 define su contenido.
CustomDefined 1 19 Este campo es obligatorio y las estructuras que derivan de esta plantilla pueden definir su contenido.
FirstCluster 20 4 Este campo es obligatorio y la sección 6.2.2 define su contenido.
Longitud de Datos veinticuatro 8 Este campo es obligatorio y la sección 6.2.3 define su contenido.

6.2.1 Campo EntryType

El campo EntryType tiene tres modos de uso que define el valor del campo (vea la lista siguiente).

  • 00h, que es un marcador de fin de directorio y se aplican las siguientes condiciones:
    • Todos los demás campos de DirectoryEntry especificados están realmente reservados
    • Todas las entradas de directorio posteriores del directorio especificado también son marcadores de fin de directorio
    • Los marcadores de fin de directorio solo son válidos fuera de los conjuntos de entradas de directorio
    • Las implementaciones pueden sobrescribir los marcadores de fin de directorio según sea necesario.
  • Entre 01h y 7Fh inclusive, que es un marcador de entrada de directorio sin usar y se aplican las condiciones siguientes:
    • Todos los demás campos de DirectoryEntry especificados no están definidos
    • Las entradas de directorio sin usar solo son válidas fuera de los conjuntos de entradas de directorio
    • Las implementaciones pueden sobrescribir entradas de directorio sin usar según sea necesario.
    • Este intervalo de valores corresponde al campo InUse (consulte la sección 6.2.1.4) que contiene el valor 0.
  • Entre 81h y FFh inclusive, se trata de una entrada de directorio regular y las siguientes condiciones se aplican:
    • El contenido del campo EntryType (vea la tabla 15) determina el diseño del resto de la estructura DirectoryEntry.
    • Este intervalo de valores, y solo este intervalo de valores, son válidos dentro de un conjunto de entradas de directorio.
    • Este intervalo de valores corresponde directamente al campo InUse (consulte la sección 6.2.1.4) que contiene el valor 1.

Para evitar que modificaciones en el campo InUse (vea la sección 6.2.1.4) resulten erróneamente en un marcador de fin de directorio, el valor 80h no es válido.

Estructura de campo EntryType genérica de la tabla 15

Nombre del campo

de desplazamiento

(bit)

Tamaño

(bits)

Comentarios
Código de Tipo 0 5 Este campo es obligatorio y la sección 6.2.1.1 define su contenido.
TipoImportancia 5 1 Este campo es obligatorio y la sección 6.2.1.2 define su contenido.
TipoCategoría 6 1 Este campo es obligatorio y la sección 6.2.1.3 define su contenido.
InUse 7 1 Este campo es obligatorio y la sección 6.2.1.4 define su contenido.
6.2.1.1 Campo TypeCode

El campo TypeCode describe parcialmente el tipo específico de la entrada de directorio especificada. Este campo, además de los campos TypeImportance y TypeCategory (consulte la sección 6.2.1.2 y la sección 6.2.1.3, respectivamente) identifican de forma única el tipo de la entrada de directorio especificada.

Todos los valores posibles de este campo son válidos, a menos que los campos TypeImportance y TypeCategory contengan el valor 0; en ese caso, el valor 0 no es válido para este campo.

6.2.1.2 Campo TypeImportance

El campo TypeImportance describirá la importancia de la entrada de directorio especificada.

Los valores válidos para este campo serán:

6.2.1.3 Campo TypeCategory

El campo TypeCategory describirá la categoría de la entrada de directorio especificada.

Los valores válidos para este campo serán:

  • 0, lo que significa que la entrada de directorio especificada es principal (consulte la sección 6.3)
  • 1, lo que significa que la entrada de directorio especificada es secundaria (consulte la sección 6.4)
6.2.1.4 InUse field

El campo InUse describirá si la entrada de directorio especificada está en uso o no.

Los valores válidos para este campo serán:

  • 0, lo que significa que la entrada de directorio especificada no está en uso; esto significa que la estructura especificada es realmente una entrada de directorio sin usar.
  • 1, lo que significa que la entrada de directorio especificada está en uso; esto significa que la estructura especificada es una entrada de directorio normal.

6.2.2 Campo FirstCluster

El campo FirstCluster contendrá el índice del primer clúster de una asignación en el montón de clúster asociado a la entrada de directorio especificada.

El intervalo válido de valores para este campo será:

  • Exactamente 0, lo que significa que no existe ninguna asignación de clúster
  • Entre 2 y ClusterCount + 1, que es el intervalo de índices de clúster válidos

Las estructuras que derivan de esta plantilla pueden redefinir los campos FirstCluster y DataLength, si una asignación de clúster no es compatible con la estructura derivada.

6.2.3 Campo LongitudDeDatos

El campo DataLength describe el tamaño, en bytes, de los datos que contiene la asignación de clúster asociada.

El intervalo válido de valor para este campo es:

  • Al menos 0; Si el campo FirstCluster contiene el valor 0, el único valor válido de este campo es 0.
  • Como máximo ClusterCount * 2 SectoresPerClusterShift * 2 BytesPerSectorShift

Las estructuras que derivan de esta plantilla pueden volver a definir los campos FirstCluster y DataLength, si una asignación de clúster no es posible para la estructura derivada.

6.3 Plantilla genérica de entrada principal del directorio

La primera entrada de directorio de un conjunto de entradas de directorio será una entrada de directorio principal. Todas las entradas de directorio posteriores, si las hay, en el conjunto de entradas de directorio serán entradas de directorio secundarias (consulte la sección 6.4).

La capacidad de interpretar la plantilla Generic Primary DirectoryEntry es obligatoria.

Todas las estructuras de entrada del directorio principal derivan de la plantilla de Entrada del Directorio Principal Genérica (consulte la tabla 16), que se deriva de la plantilla de Entrada del Directorio Genérica (consulte la sección 6.2).

Tabla 16 Plantilla de directorio principal genéricoEntry

Nombre del campo

de desplazamiento

(byte)

Tamaño

(byte)

Comentarios
Tipo de Entrada 0 1 Este campo es obligatorio y la sección 6.3.1 define su contenido.
Cuenta secundaria 1 1 Este campo es obligatorio y la sección 6.3.2 define su contenido.
SetChecksum 2 2 Este campo es obligatorio y la sección 6.3.3 define su contenido.
BanderasPrimariasGenerales 4 2 Este campo es obligatorio y la sección 6.3.4 define su contenido.
CustomDefined 6 14 Este campo es obligatorio y las estructuras que derivan de esta plantilla definen su contenido.
FirstCluster 20 4 Este campo es obligatorio y la sección 6.3.5 define su contenido.
Longitud de Datos veinticuatro 8 Este campo es obligatorio y la sección 6.3.6 define su contenido.

6.3.1 Campo EntryType

El campo EntryType se ajustará a la definición proporcionada en la plantilla DirectoryEntry genérica (consulte la sección 6.2.1).

6.3.1.1 Campo Código de Tipo

El campo TypeCode se ajustará a la definición proporcionada en la plantilla DirectoryEntry genérica (consulte la sección 6.2.1.1).

6.3.1.2 Campo ImportanciaTipo

El campo TypeImportance se ajustará a la definición proporcionada en la plantilla DirectoryEntry genérica (consulte la sección 6.2.1.2).

6.3.1.2.1 Entradas críticas del directorio principal

Las entradas críticas del directorio principal contienen información que es fundamental para la administración adecuada de un volumen exFAT. Solo el directorio raíz contiene entradas críticas del directorio principal (las entradas del directorio de archivos son una excepción, consulte sección 7.4).

La definición de entradas críticas del directorio principal se correlaciona con el número de revisión exFAT principal. Las implementaciones admitirán todas las entradas críticas del directorio principal y solo registrarán las estructuras críticas de entrada de directorio principal que define esta especificación.

6.3.1.2.2 Entradas de directorio principal benignas

Las entradas de directorio principal benignas contienen información adicional que puede ser útil para administrar un volumen exFAT. Cualquier directorio puede contener entradas de directorio principal benignas.

La definición de entradas de directorio principal benignas se correlaciona con el número de revisión exFAT menor. La compatibilidad con cualquier entrada de directorio principal benigna esta especificación, o cualquier especificación posterior, define es opcional. Una entrada benigna no reconocida del directorio principal convierte todo el conjunto de entradas de directorio en no reconocidas (más allá de la definición de las plantillas de entrada de directorio aplicables).

6.3.1.3 Campo TypeCategory

El campo TypeCategory se ajustará a la definición proporcionada en la plantilla DirectoryEntry genérica (consulte la sección 6.2.1.3).

Para esta plantilla, el valor válido para este campo será 0.

6.3.1.4 Campo InUse

El campo InUse se ajustará a la definición proporcionada en la plantilla DirectoryEntry genérica (consulte la sección 6.2.1.4).

6.3.2 Campo SecondaryCount

El campo SecondaryCount describirá el número de entradas del directorio secundario que siguen inmediatamente a la entrada de directorio principal especificada. Estas entradas de directorio secundario, junto con la entrada de directorio principal especificada, componen el conjunto de entradas de directorio.

El intervalo válido de valores para este campo será:

  • Al menos 0, lo que significa que esta entrada de directorio principal es la única entrada del conjunto de entradas de directorio.
  • Como máximo 255, lo que significa que las siguientes 255 entradas de directorio y esta entrada de directorio principal componen el conjunto de entradas de directorio.

Las estructuras críticas de entrada de directorio principal que derivan de esta plantilla pueden redefinir los campos SecondaryCount y SetChecksum.

6.3.3 Campo SetChecksum

El campo SetChecksum contendrá la suma de comprobación (checksum) de todas las entradas de directorio en el conjunto especificado de entradas de directorio. Sin embargo, la suma de comprobación excluye este campo (vea la figura 2). Las implementaciones comprobarán que el contenido de este campo es válido antes de usar cualquier otra entrada de directorio en el conjunto de entradas de directorio determinado.

Las estructuras críticas de entrada de directorio principal que derivan de esta plantilla pueden redefinir los campos SecondaryCount y SetChecksum.

Figura 2 Cálculo entrySetChecksum

UInt16 EntrySetChecksum
(
    UCHAR * Entries,       // points to an in-memory copy of the directory entry set
    UCHAR   SecondaryCount
)
{
    UInt16 NumberOfBytes = ((UInt16)SecondaryCount + 1) * 32;
    UInt16 Checksum = 0;
    UInt16 Index;

    for (Index = 0; Index < NumberOfBytes; Index++)
    {
        if ((Index == 2) || (Index == 3))
        {
            continue;
        }
        Checksum = ((Checksum&1) ? 0x8000 : 0) + (Checksum>>1) +  (UInt16)Entries[Index];
    }
    return Checksum;
}

6.3.4 Campo GeneralPrimaryFlags

El campo GeneralPrimaryFlags contiene marcas (vea la tabla 17).

Las estructuras de entrada de directorio principal críticas que derivan de esta plantilla pueden redefinir este campo.

Tabla 17 Estructura de campo genérica de GeneralPrimaryFlags

Nombre del campo

de desplazamiento

(bit)

Tamaño

(bits)

Comentarios
AllocationPossible 0 1 Este campo es obligatorio y la sección 6.3.4.1 define su contenido.
NoFatChain 1 1 Este campo es obligatorio y la sección 6.3.4.2 define su contenido.
CustomDefined 2 14 Este campo es obligatorio y las estructuras que derivan de esta plantilla pueden definir este campo.
6.3.4.1 Campo AllocationPossible

El campo AllocationPossible describirá si es posible o no una asignación en el montón de clústeres para la entrada de directorio especificada.

Los valores válidos para este campo serán:

  • 0, lo que significa que no es posible una asignación asociada de clústeres y los campos FirstCluster y DataLength son realmente indefinidos (las estructuras que derivan de esta plantilla pueden redefinir esos campos).
  • 1, lo que significa que es posible una asignación asociada de clústeres y los campos FirstCluster y DataLength son los definidos
6.3.4.2 Campo NoFatChain

El campo NoFatChain indicará si el FAT activo describe o no la cadena de clústeres de la asignación especificada.

Los valores válidos para este campo serán:

  • 0, lo que significa que las entradas FAT correspondientes para la cadena de clústeres de la asignación son válidas y las implementaciones las interpretarán; si el campo AllocationPossible contiene el valor 0, o si el campo AllocationPossible contiene el valor 1 y el campo FirstCluster contiene el valor 0, el único valor válido de este campo es 0.
  • 1, lo que significa que la asignación asociada es una serie contigua de clústeres; las entradas FAT correspondientes para los clústeres no son válidas y las implementaciones no las interpretarán; las implementaciones pueden usar la siguiente ecuación para calcular el tamaño de la asignación asociada: DataLength / (2SectoresPerClusterShift* 2BytesPerSectorShift) redondeado hasta el entero más cercano

Si las estructuras de entrada de directorio principal críticas que derivan de esta plantilla vuelven a definir el campo GeneralPrimaryFlags, las entradas FAT correspondientes para cualquier cadena de clústeres de asignación asociada son válidas.

6.3.5 Campo FirstCluster

El campo FirstCluster se ajustará a la definición proporcionada en la plantilla DirectoryEntry genérica (consulte la sección 6.2.2).

Si el bit NoFatChain es 1, entonces FirstCluster debe apuntar a un clúster válido en la pila de clústeres.

Las estructuras de entrada de directorio principal críticas que derivan de esta plantilla pueden redefinir los campos FirstCluster y DataLength. Otras estructuras que derivan de esta plantilla pueden redefinir los campos FirstCluster y DataLength solo si el campo AllocationPossible contiene el valor 0.

6.3.6 Campo LongitudDeDatos (DataLength)

El campo DataLength se ajustará a la definición proporcionada en la plantilla DirectoryEntry genérica (consulte la sección 6.2.3).

Si el bit NoFatChain es 1, DataLength no debe ser cero. Si el campo FirstCluster es cero, DataLength también debe ser cero.

Las estructuras de entrada de directorio principal críticas que derivan de esta plantilla pueden redefinir los campos FirstCluster y DataLength. Otras estructuras que derivan de esta plantilla pueden redefinir los campos FirstCluster y DataLength solo si el campo AllocationPossible contiene el valor 0.

6.4 Plantilla Genérica de Entrada de Directorio Secundario

El propósito central de las entradas del directorio secundario es proporcionar información adicional sobre un conjunto de entradas de directorio. La capacidad de interpretar la plantilla Generic Secondary DirectoryEntry es obligatoria.

La definición de entradas de directorio secundaria críticas y benignas se correlaciona con el número de revisión menor de exFAT. La compatibilidad con cualquier entrada de directorio secundaria crítica o benigna esta especificación, o especificaciones posteriores, define es opcional.

Todas las estructuras de entrada de directorio secundaria derivan de la plantilla DirectoryEntry secundaria genérica (consulte la tabla 18), que se deriva de la plantilla DirectoryEntry genérica (consulte la sección 6.2).

Tabla 18 Plantilla de entrada de directorio secundaria genérica

Nombre del campo

de desplazamiento

(byte)

Tamaño

(byte)

Comentarios
Tipo de Entrada 0 1 Este campo es obligatorio y la sección 6.4.1 define su contenido.
BanderasSecundariasGenerales 1 1 Este campo es obligatorio y la sección 6.4.2 define su contenido.
CustomDefined 2 18 Este campo es obligatorio y las estructuras que derivan de esta plantilla definen su contenido.
FirstCluster 20 4 Este campo es obligatorio y la sección 6.4.3 define su contenido.
Longitud de Datos veinticuatro 8 Este campo es obligatorio y la sección 6.4.4 define su contenido.

6.4.1 Campo EntryType

El campo EntryType se ajustará a la definición proporcionada en la plantilla DirectoryEntry genérica (consulte la sección 6.2.1).

6.4.1.1 Campo TypeCode

El campo TypeCode se ajustará a la definición proporcionada en la plantilla DirectoryEntry genérica (consulte la sección 6.2.1.1).

6.4.1.2 Campo TipoImportancia

El campo TypeImportance se ajustará a la definición proporcionada en la plantilla DirectoryEntry genérica (consulte la sección 6.2.1.2).

6.4.1.2.1 Entradas críticas del directorio secundario

Las entradas críticas del directorio secundario contienen información que es fundamental para la administración adecuada de su conjunto de entradas de directorio contenedor. Aunque la compatibilidad con cualquier entrada de directorio secundaria crítica específica es opcional, una entrada de directorio crítica no reconocida representa todo el conjunto de entradas de directorio como no reconocido (más allá de la definición de las plantillas de entrada de directorio aplicables).

Sin embargo, si un conjunto de entradas de directorio contiene al menos una entrada de directorio secundaria crítica que no reconoce una implementación, la implementación interpretará como máximo las plantillas de las entradas de directorio del conjunto de entradas de directorio y no los datos asociados a ninguna asignación asociada a ninguna entrada de directorio del conjunto de entradas de directorio contiene (las entradas del directorio de archivos son una excepción, consulte sección 7.4).

6.4.1.2.2 Entradas de directorio secundario benignas

Las entradas secundarias benignas del directorio contienen información adicional que puede resultar útil para gestionar su conjunto de registros de directorio. La compatibilidad con cualquier entrada de directorio secundaria benigna específica es opcional. Las entradas de directorio secundario benignas no reconocidas no representan todo el conjunto de entradas de directorio como no reconocidos.

Las implementaciones pueden omitir cualquier entrada secundaria benigna que no reconozca.

6.4.1.3 Campo TypeCategory

El campo TypeCategory se ajustará a la definición proporcionada en la plantilla DirectoryEntry genérica (consulte la sección 6.2.1.3).

Para esta plantilla, el valor válido para este campo es 1.

6.4.1.4 Campo EnUso

El campo InUse se ajustará a la definición proporcionada en la plantilla DirectoryEntry genérica (consulte la sección 6.2.1.4).

6.4.2 Campo GeneralSecondaryFlags

El campo GeneralSecondaryFlags contiene marcas (vea la tabla 19).

Tabla 19 General GeneralSecondaryFlags (estructura de campo)

Nombre del campo

de desplazamiento

(bit)

Tamaño

(bits)

Comentarios
AsignaciónPosible 0 1 Este campo es obligatorio y la sección 6.4.2.1 define su contenido.
NoFatChain 1 1 Este campo es obligatorio y la sección 6.4.2.2 define su contenido.
CustomDefined 2 6 Este campo es obligatorio y las estructuras que derivan de esta plantilla pueden definir este campo.
6.4.2.1 Campo AllocationPossible

El campo AllocationPossible tendrá la misma definición que el campo del mismo nombre en la plantilla de DirectoryEntry Principal Genérico (consulte la sección 6.3.4.1).

6.4.2.2 Campo NoFatChain

El campo NoFatChain tendrá la misma definición que el campo del mismo nombre en la plantilla Entry Directorio Primario Genérico (consulte la sección 6.3.4.2).

6.4.3 Campo FirstCluster

El campo FirstCluster se ajustará a la definición proporcionada en la plantilla DirectoryEntry genérica (consulte la sección 6.2.2).

Si el bit NoFatChain es 1, entonces FirstCluster debe apuntar a un clúster válido en la pila de clústeres.

6.4.4 Campo Longitud de Datos

El campo DataLength se ajustará a la definición proporcionada en la plantilla DirectoryEntry genérica (consulte la sección 6.2.3).

Si el bit NoFatChain es 1, DataLength no debe ser cero. Si el campo FirstCluster es cero, DataLength también debe ser cero.

7 Definiciones de entrada de directorio

La revisión 1.00 del sistema de archivos exFAT define las siguientes entradas de directorio:

7.1 Entrada de directorio de mapa de bits de asignación

En el sistema de archivos exFAT, una FAT no describe el estado de asignación de los clústeres; en su lugar, un mapa de bits de asignación sí lo hace. Los mapas de bits de asignación existen en el montón de clústeres (consulte la sección 7.1.5) y tienen entradas de directorio principal críticas correspondientes en el directorio raíz (consulte la tabla 20).

El campo NumberOfFats determina el número de entradas de directorio de mapa de bits de asignación válidas en el directorio raíz. Si el campo NumberOfFats contiene el valor 1, el único número válido de entradas del directorio mapa de bits de asignación es 1. Además, la entrada del directorio mapa de bits de asignación solo es válida si describe el mapa de bits de primera asignación (vea sección 7.1.2.1). Si el campo NumberOfFats contiene el valor 2, el único número válido de entradas del directorio mapa de bits de asignación es 2. Además, las dos entradas del directorio del mapa de bits de asignación solo son válidas si una describe el mapa de bits de primera asignación y la otra describe el mapa de bits de segunda asignación.

Tabla 20 Asignación Directorio de mapa de bitsRegistro

Nombre del campo

de desplazamiento

(byte)

Tamaño

(byte)

Comentarios
Tipo de Entrada 0 1 Este campo es obligatorio y la sección 7.1.1 define su contenido.
Banderas de Bitmap 1 1 Este campo es obligatorio y la sección 7.1.2 define su contenido.
Reservado 2 18 Este campo es obligatorio y su contenido está reservado.
FirstCluster 20 4 Este campo es obligatorio y la sección 7.1.3 define su contenido.
Longitud de Datos veinticuatro 8 Este campo es obligatorio y la sección 7.1.4 define su contenido.

Campo EntryType 7.1.1

El campo EntryType se ajustará a la definición proporcionada en la plantilla Directorio principal genéricoEntry (consulte la sección 6.3.1).

Campo TypeCode 7.1.1.1

El campo TypeCode se ajustará a la definición proporcionada en la plantilla de entrada de directorio principal genérico (consulte la sección 6.3.1.1).

Para una entrada de directorio de asignación de mapa de bits, el valor válido para este campo es 1.

7.1.1.2 Campo TypeImportance

El campo TypeImportance se ajustará a la definición proporcionada en la plantilla de Directorio Principal Genérico (consulte la sección 6.3.1.2).

Para una entrada de directorio de un mapa de bits de asignación, el valor válido para este campo es 0.

7.1.1.3 Campo TypeCategory

El campo TypeCategory deberá ajustarse a la definición proporcionada en la plantilla de Entrada de Directorio Primario Genérico (consulte la sección 6.3.1.3).

7.1.1.4 Campo InUse

El campo InUse debe ajustarse a la definición proporcionada en la plantilla de Entrada de Directorio Genérico Principal (consulte la sección 6.3.1.4).

7.1.2 Campo BitmapFlags

El campo BitmapFlags contiene marcas (vea la tabla 21).

Tabla 21 Estructura de campo BitmapFlags

Nombre del campo

de desplazamiento

(bit)

Tamaño

(bits)

Comentarios
BitmapIdentifier 0 1 Este campo es obligatorio y la sección 7.1.2.1 define su contenido.
Reservado 1 7 Este campo es obligatorio y su contenido está reservado.
7.1.2.1 Campo BitmapIdentifier

El campo BitmapIdentifier indicará qué mapa de bits de asignación describe la entrada de directorio especificada. Las implementaciones usarán el mapa de bits de primera asignación junto con la Primera FAT y usarán el mapa de bits de segunda asignación junto con la Segunda FAT. El campo ActiveFat indica qué FAT y mapa de bits de asignación están activos.

Los valores válidos para este campo serán:

  • 0, lo que significa que la entrada de directorio especificada describe el mapa de bits de primera asignación
  • 1, lo que significa que la entrada de directorio especificada describe el mapa de bits de segunda asignación y solo es posible cuando NumberOfFats contiene el valor 2.

7.1.3 Campo FirstCluster

El campo FirstCluster debe ajustarse a la definición proporcionada en la plantilla Entrada de Directorio Primario Genérico (consulte la sección 6.3.5).

Este campo contiene el índice del primer clúster de la cadena de clústeres, como se describe en FAT, que hospeda el mapa de bits de asignación.

7.1.4 Campo DataLength

El campo DataCluster se ajustará a la definición proporcionada en la plantilla de entrada del Directorio Principal Genérico (consulte la sección 6.3.6).

Mapa de bits de asignación 7.1.5

Un mapa de bits de asignación registra el estado de asignación de los clústeres en el montón de clústeres. Cada bit de un mapa de bits de asignación indica si su clúster correspondiente está disponible para la asignación o no.

Un mapa de bits de asignación representa clústeres del índice más bajo al más alto (consulte la tabla 22). Por motivos históricos, el primer clúster tiene el índice 2.

Nota:

El primer bit del mapa de bits es el bit de orden más bajo del primer byte.

Tabla 22 Estructura del mapa de bits de asignación

Nombre del campo

de desplazamiento

(bit)

Tamaño

(bits)

Comentarios
BitmapEntry[2] 0 1 Este campo es obligatorio y la sección 7.1.5.1 define su contenido.

.

.

.

.

.

.

.

.

.

.

.

.

BitmapEntry[ClusterCount+1] ClusterCount: 1 1

Este campo es obligatorio y la sección 7.1.5.1 define su contenido.

Nota: Los sectores principal y de arranque de copia de seguridad contienen el campo ClusterCount.

Reservado Contador de Clústeres (DataLength * 8): ClusterCount

Este campo es obligatorio y su contenido, si existe, están reservados.

Nota: Los sectores principal y de arranque de copia de seguridad contienen el campo ClusterCount.

7.1.5.1 BitmapEntry[2] ... BitmapEntry[ClusterCount+1] Campos

Cada campo BitmapEntry de esta matriz representa un clúster en el montón de clústeres. BitmapEntry[2] representa el primer clúster del montón de clústeres y BitmapEntry[ClusterCount+1] representa el último clúster del montón del clúster.

Los valores válidos para estos campos serán:

  • 0, que describe el clúster correspondiente como disponible para la asignación
  • 1, que describe el clúster correspondiente como no disponible para la asignación (es posible que una asignación de clúster ya consuma el clúster correspondiente o el FAT activo puede describir el clúster correspondiente como incorrecto).

7.2 Entrada de directorio de tabla de mayúsculas y minúsculas

La tabla de mayúsculas y minúsculas define la conversión de caracteres en minúsculas a mayúsculas. Esto es importante debido a que la entrada del directorio para el nombre del archivo (consulte la sección 7.7) que usa caracteres Unicode y el sistema de archivos exFAT no distingue entre mayúsculas y minúsculas y las conserva. La tabla up-case existe en el montón de clústeres (consulte la sección 7.2.5) y tiene una entrada de directorio principal crítica correspondiente en el directorio raíz (consulte la tabla 23). El número válido de entradas del directorio Tabla de mayúsculas es 1.

Debido a la relación entre la tabla de mayúsculas y los nombres de archivo, las implementaciones no deben modificar la tabla de mayúsculas, excepto como resultado de las operaciones de formato.

Tabla 23 Estructura de directorio de tabla de mayúsculas

Nombre del campo

de desplazamiento

(byte)

Tamaño

(byte)

Comentarios
Tipo de Entrada 0 1 Este campo es obligatorio y la sección 7.2.1 define su contenido.
Reserved1 1 3 Este campo es obligatorio y su contenido está reservado.
TableChecksum 4 4 Este campo es obligatorio y la sección 7.2.2 define su contenido.
Reservado2 8 12 Este campo es obligatorio y su contenido está reservado.
FirstCluster 20 4 Este campo es obligatorio y la sección 7.2.3 define su contenido.
Longitud de Datos veinticuatro 8 Este campo es obligatorio y la sección 7.2.4 define su contenido.

7.2.1 Campo EntryType

El campo EntryType se ajustará a la definición proporcionada en la plantilla Directorio principal genéricoEntry (consulte la sección 6.3.1).

7.2.1.1 Campo TypeCode

El campo TypeCode se ajustará a la definición proporcionada en la plantilla de entrada de directorio principal genérico (consulte la sección 6.3.1.1).

Para la entrada del directorio Tabla mayúsculas y minúsculas, el valor válido para este campo es 2.

7.2.1.2 Campo TipoImportancia

El campo TypeImportance se ajustará a la definición proporcionada en la plantilla de Directorio Principal Genérico (consulte la sección 6.3.1.2).

Para la entrada del directorio Tabla de mayúsculas, el valor válido para este campo es 0.

7.2.1.3 Campo TypeCategory

El campo TypeCategory deberá ajustarse a la definición proporcionada en la plantilla de Entrada de Directorio Primario Genérico (consulte la sección 6.3.1.3).

7.2.1.4 Campo InUse

El campo InUse debe ajustarse a la definición proporcionada en la plantilla de Entrada de Directorio Genérico Principal (consulte la sección 6.3.1.4).

7.2.2 Campo TableChecksum

El campo TableChecksum contiene la suma de comprobación de la tabla de mayúsculas (descrita por los campos FirstCluster y DataLength). Las implementaciones comprobarán que el contenido de este campo es válido antes de usar la tabla de mayúsculas.

Figura 3: Cálculo de TableChecksum

UInt32 TableChecksum
(
    UCHAR  * Table,    // points to an in-memory copy of the up-case table
    UInt64   DataLength
)
{
    UInt32 Checksum = 0;
    UInt64 Index;

    for (Index = 0; Index < DataLength; Index++)
    {
        Checksum = ((Checksum&1) ? 0x80000000 : 0) + (Checksum>>1) + (UInt32)Table[Index];
    }

    return Checksum;
}

7.2.3 Campo FirstCluster

El campo FirstCluster debe ajustarse a la definición proporcionada en la plantilla Entrada de Directorio Primario Genérico (consulte la sección 6.3.5).

Este campo contiene el índice del primer clúster de la cadena de clústeres, como se describe en FAT, que hospeda la tabla de mayúsculas y minúsculas.

7.2.4 Campo DataLength

El campo DataCluster se ajustará a la definición proporcionada en la plantilla de entrada del Directorio Principal Genérico (consulte la sección 6.3.6).

7.2.5 Tabla de conversión a mayúsculas

Una tabla de mayúsculas y minúsculas es una serie de asignaciones de caracteres Unicode. Una asignación de caracteres consta de un campo de 2 bytes, en el que el índice del campo en la tabla de mayúsculas representa el carácter Unicode que se va a convertir a mayúsculas, y el campo de 2 bytes representa el carácter Unicode convertido a mayúsculas.

Los primeros 128 caracteres Unicode tienen asignaciones obligatorias (consulte la tabla 24). Una tabla de mayúsculas que tenga cualquier otra asignación de caracteres para los primeros 128 caracteres Unicode es inválida.

Las implementaciones que solo admiten caracteres del intervalo de asignación obligatorio pueden omitir las asignaciones del resto de la tabla de mayúsculas. Estas implementaciones solo usarán caracteres del intervalo de asignación obligatorio al crear o cambiar el nombre de los archivos (a través de la entrada del directorio Nombre de archivo, consulte la sección 7.7). Al convertir en mayúsculas nombres de archivo existentes, estas implementaciones no convertirán en mayúsculas los caracteres del rango de asignación no obligatorio, sino que los dejarán intactos en el nombre de archivo resultante en mayúsculas (esto es un uso parcial de mayúsculas). Al comparar nombres de archivos, estas implementaciones considerarán equivalentes los nombres de archivos que difieran del nombre en comparación únicamente por caracteres Unicode dentro del intervalo de asignación no obligatoria. Aunque estos nombres de archivo solo son potencialmente equivalentes, estas implementaciones no pueden garantizar que el nombre de archivo completamente en mayúsculas no entre en conflicto con el nombre con el que se compara.

Tabla 24 Entradas obligatorias de las primeras 128 mayúsculas en la tabla

Tabla de índices + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7
0000h 00:00 h 0001h 0002h 0003h 0004h 0005h 0006h 0007h
0008h 0008h 00:09 h 000Ah 000Bh 000Ch 000Dh 000Eh 000Fh
0010h 0010h 0011h 0012h 0013h 0014h 0015h 0016h 0017h
0018h 0018h 0019h 001Ah 001Bh 001Ch 001Dh 001Eh 001Fh
0020h 0020h 0021h 0022h 0023h 0024h 0025h 0026h 0027h
0028h 0028h 0029h 002Ah 002Bh 002Ch 002Dh 002Eh 002Fh
0030h 0030h 0031h 0032h 0033h 0034h 0035h 0036h 0037h
0038h 0038h 0039h 003Ah 003Bh 003Ch 003Dh 003Eh 003Fh
0040h 0040h 0041h 0042h 0043h 0044h 0045h 0046h 0047h
0048h 0048h 0049h 004Ah 004Bh 004Ch 004Dh 004Eh 004Fh
0050h 0050h 0051h 0052h 0053h 0054h 0055h 0056h 0057h
0058h 0058h 0059h 005Ah 005Bh 005Ch 005Dh 005Eh 005Fh
0060h 0060h 0041h 0042h 0043h 0044h 0045h 0046h 0047h
0068h 0048h 0049h 004Ah 004Bh 004Ch 004Dh 004Eh 004Fh
0070h 0050h 0051h 0052h 0053h 0054h 0055h 0056h 0057h
0078h 0058h 0059h 005Ah 007Bh 007Ch 007Dh 007Eh 007Fh

(Nota: las entradas con asignaciones de mayúsculas no idénticas están en negrita)

Al dar formato a un volumen, las implementaciones pueden generar una tabla de caracteres en mayúsculas en un formato comprimido mediante la compresión de mapeo de identidades, ya que una gran parte del espacio de caracteres Unicode no tiene ningún concepto de mayúscula o minúscula (lo que significa que los caracteres "minúsculas" y "mayúsculas" son equivalentes). Las implementaciones comprimen una tabla de mayúsculas mediante la representación de una serie de asignaciones de identidad con el valor FFFFh seguido del número de asignaciones de identidad.

Por ejemplo, una implementación puede representar los primeros 100 mapeos de caracteres (64h) con las ocho entradas siguientes de una tabla de mayúsculas comprimida.

FFFFh, 0061h, 0041h, 0042h, 0043h

Las dos primeras entradas indican que los primeros 97 (61h) caracteres (de 0000h a 0060h) tienen mapeos de identidad. Los caracteres subsecuentes, desde 0061h hasta 0063h, se corresponden con los caracteres 0041h hasta 0043h, respectivamente.

La capacidad de proporcionar una tabla de mayúsculas y minúsculas comprimidas al dar formato a un volumen es opcional. Sin embargo, la capacidad de interpretar tanto una tabla de mayúsculas sin comprimir como una comprimida es obligatoria. El valor del campo TableChecksum siempre se ajusta a cómo existe la tabla de caracteres en mayúsculas en el volumen, que puede estar en formato comprimido o descomprimido.

Al aplicar formato a un volumen, las implementaciones deben registrar la tabla de mayúsculas y minúsculas recomendada en formato comprimido (vea la tabla 25), para la que el valor del campo TableChecksum es E619D30Dh.

Si una implementación define su propia tabla de mayúsculas y minúsculas, comprimida o sin comprimir, esa tabla abarcará el intervalo de caracteres Unicode completo (desde códigos de caracteres 0000h hasta FFFFh inclusive).