GRASA

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 18 de junio de 2022; las comprobaciones requieren 2 ediciones .

FAT ( English  File Allocation Table "tabla de asignación de archivos") es una arquitectura de sistema de archivos clásica que, debido a su simplicidad, todavía se usa ampliamente para unidades flash . Se utiliza en disquetes , tarjetas de memoria y algunos otros medios de almacenamiento. Anteriormente, también se usaba en discos duros.

Desarrollado por Bill Gates y Mark McDonald en 1976-1977 [1] [2] . Fue utilizado como sistema de archivos principal en los sistemas operativos de las familias MS-DOS y Windows 9x .

La estructura FAT sigue el estándar ECMA-107 y está definida en detalle por la especificación oficial de Microsoft conocida como FATGEN [3] .

Versiones del sistema FAT

Hay cuatro versiones de FAT: FAT12 , FAT16 , FAT32 y exFAT (FAT64) . Difieren en el número de bits de los registros en la estructura del disco, es decir, la cantidad de bits reservados para almacenar el número de clúster. FAT12 se usa principalmente para disquetes , FAT16 para discos pequeños. Basado en FAT, se desarrolló un nuevo sistema de archivos exFAT (FAT extendido), utilizado principalmente para unidades flash .

Inicialmente, FAT no admitía un sistema de directorio jerárquico: todos los archivos estaban ubicados en la raíz del disco. Esto se hizo por simplicidad, ya que en disquetes de un solo lado con una capacidad de solo 160–180 KB, simplemente no tenía sentido ordenar algunos archivos en directorios. Con la difusión de los disquetes de 320 o más kilobytes, almacenar todos los archivos en la raíz resultó ser un inconveniente, además, el pequeño tamaño del directorio raíz limitaba la cantidad de archivos en el disco. Los directorios se introdujeron con el lanzamiento de MS-DOS 2.0.

Diferentes sistemas operativos también han implementado varias extensiones FAT. Por ejemplo, DR-DOS tiene atributos de acceso a archivos adicionales; en Windows 95 , Linux  : compatibilidad con nombres de archivo largos (LFN) en formato Unicode (Virtual FAT - VFAT); en OS/2  , atributos extendidos de todos los archivos.

VFAT

VFAT  es una extensión FAT introducida en Windows 95 . En FAT, los nombres de archivo están en formato 8.3 y consisten solo en caracteres ASCII . Se agregó soporte para nombres de archivo largos (hasta 255 caracteres) ( Nombre de archivo largo, LFN ) en codificación UTF-16LE a VFAT ,  mientras que los LFN se almacenan simultáneamente con nombres en formato 8.3, llamados retrospectivamente SFN ( Nombre de archivo corto en inglés ). Los LFN no distinguen entre mayúsculas y minúsculas al buscar, sin embargo, a diferencia de los SFN, que se almacenan en mayúsculas, los LFN conservan el caso especificado cuando se creó el archivo [4] [5] .  

Estructura del sistema FAT

En el sistema de archivos FAT, los sectores de disco contiguos se combinan en unidades denominadas clústeres . El número de sectores en un grupo es igual a una potencia de dos (ver más abajo). Se asigna un número entero de clústeres (al menos uno) para almacenar datos de archivos, por lo que, por ejemplo, si el tamaño del archivo es de 40 bytes y el tamaño del clúster es de 4 KB, solo el 1 % del espacio asignado será realmente ocupado por la información del archivo. Para evitar tales situaciones, es recomendable reducir el tamaño de los clústeres y viceversa para reducir la cantidad de información de direcciones y aumentar la velocidad de las operaciones con archivos. En la práctica, se elige algún compromiso. Dado que es posible que la capacidad del disco no se exprese en un número entero de clústeres, generalmente al final del volumen hay los llamados sectores excedentes: un "resto" menor que el tamaño de un clúster, que el sistema operativo no puede asignar para almacenar información.

El espacio del volumen FAT32 se divide lógicamente en tres áreas contiguas:

FAT12 y FAT16 también tienen un área dedicada para el directorio raíz. Tiene una posición fija (inmediatamente después del último elemento de la tabla FAT) y un tamaño fijo en elementos de 32 bytes, es decir, al describir en Partition Boot Record, es precisamente la cantidad de elementos de 32 bytes que se indica , cada uno de los cuales describe cualquier elemento del directorio raíz (ya sea un archivo u otro subdirectorio).

Si un grupo pertenece a un archivo, la celda correspondiente en la tabla FAT contiene el número del siguiente grupo del mismo archivo. Si la celda corresponde al último grupo del archivo, entonces contiene un valor especial (0xFFFF para FAT16). Por lo tanto, se construye una cadena de clústeres de archivos. Los ceros corresponden a clústeres no utilizados en la tabla. Los clústeres "malos" (que se excluyen del procesamiento, por ejemplo, porque el área correspondiente del dispositivo no se puede leer) también tienen un código especial (0xFFF7 para FAT16).

Cuando se elimina un archivo, el primer carácter del nombre se reemplaza con el código especial 0xE5 y la cadena de clústeres del archivo en la tabla de asignación se restablece a cero. Dado que la información sobre el tamaño del archivo (que se encuentra en el directorio junto al nombre del archivo) permanece intacta, si los grupos de archivos se ubicaron secuencialmente en el disco y no se sobrescribieron con información nueva, el archivo eliminado se puede restaurar.

Registro de arranque

La primera estructura de un volumen FAT se denomina BPB ( Bloque de parámetros BIOS  ) y se encuentra en un área reservada, en el sector cero. Esta estructura contiene información que identifica el tipo de sistema de archivos y las características físicas del medio (disquete o partición del disco duro).

Bloque de parámetros del BIOS (BPB)

BPB estaba ausente de FAT, que sirvió a MS-DOS 1.x, ya que en ese momento solo se asumían dos tipos diferentes de volúmenes: disquetes de 320 KB de cinco pulgadas de una cara y de doble cara, y el formato del volumen estaba determinado por el primer byte del área FAT. BPB se introdujo en MS-DOS 2.x a principios de 1983 como una estructura de sector de arranque obligatoria a partir de la cual determinar el formato del volumen en adelante; el antiguo esquema de detección del primer byte FAT ya no era compatible. También en MS-DOS 2.0, se introdujo una jerarquía de archivos y carpetas (antes de eso, todos los archivos se almacenaban en el directorio raíz).

La estructura BPB en MS-DOS 2.x contenía un campo de "número total de sectores" de 16 bits, lo que significaba que esta versión de FAT era fundamentalmente inaplicable para volúmenes mayores de 2 16 = 65 536 sectores, es decir, más de 32 MB con un tamaño de sector estándar de 512 bytes. En MS-DOS 4.0 (1988), el campo BPB se amplió a 32 bits, lo que supuso un aumento del tamaño del volumen teórico a 232 = 4.294.967.296 sectores, es decir, hasta 2 TB con un sector de 512 bytes.

La siguiente modificación de BPB apareció con Windows 95 OSR2, que introdujo FAT32 (en agosto de 1996). Se eliminó el límite de 2 TB en el tamaño del volumen; en teoría, un volumen FAT32 puede tener un tamaño de hasta 8 TB. Sin embargo, el tamaño de cada archivo individual no puede exceder los 4 GB. El bloque de parámetros del BIOS en FAT32, para compatibilidad con versiones anteriores de FAT, repite el BPB de FAT16 hasta el campo BPB_TotSec32 incluido, seguido de las diferencias.

El "sector de arranque" FAT32 son en realidad tres sectores de 512 bytes: los sectores 0, 1 y 2. Cada uno de ellos contiene la firma 0xAA55 en la dirección 0x1FE, es decir, en los últimos dos bytes, si el tamaño del sector es de 512 bytes. Si el tamaño del sector es superior a 512 bytes, la firma está contenida tanto en la dirección 0x1FE como en los dos últimos bytes del sector cero, es decir, está duplicada.

FSInfo

El registro de arranque de una partición FAT32 contiene una estructura denominada FSInfo que se utiliza para almacenar el valor del recuento de clústeres libres del volumen. FSInfo, por regla general, ocupa el sector 1 (ver el campo BPB_FSInfo) y tiene la siguiente estructura (direcciones relativas al comienzo del sector):

  • FSI_LeadSig. La firma de 4 bytes 0x41615252 indica que el sector se está utilizando para la estructura FSInfo.
  • FSI_Reservado1. El intervalo de 4 a 483 bytes del sector, inclusive, se pone a cero.
  • FSI_EstructuraSig. Otra firma se encuentra en 0x1E4 y contiene el valor 0x61417272.
  • FSI_Free_Count. El campo de 4 bytes en la dirección 0x1E8 contiene el último número de clústeres libres en el volumen conocido por el sistema. El valor 0xFFFFFFFF significa que se desconoce el número de clústeres libres y debe calcularse.
  • FSI_Nxt_Free. El campo de 4 bytes en la dirección 0x1EC contiene el número de clúster a partir del cual debe comenzar la búsqueda de clústeres libres en la tabla de punteros de índice. Por lo general, este campo contiene el número del último clúster FAT asignado para el almacenamiento de archivos. El valor 0xFFFFFFFF significa que la búsqueda de un clúster libre debe realizarse desde el principio de la tabla FAT, es decir, desde el segundo clúster.
  • FSI_Reservado2. Campo reservado de 12 bytes en la dirección 0x1F0.
  • FSI_TrailSig. La firma 0xAA550000 son los últimos 4 bytes del sector FSInfo.

El objetivo de introducir FSInfo es optimizar el funcionamiento del sistema, ya que en FAT32 la tabla de punteros de índice puede ser muy grande y su búsqueda byte a byte puede llevar un tiempo considerable. Sin embargo, los valores de los campos FSI_Free_Count y FSI_Nxt_Free pueden no corresponder a la realidad y se debe verificar su adecuación. Además, ni siquiera se actualizan en la copia de seguridad de FSInfo, que suele estar ubicada en el sector 7.

Determinación del tipo de volumen FAT

El sistema operativo determina el tipo de FAT de un volumen (es decir, la elección entre FAT12, FAT16 y FAT32) en función de la cantidad de clústeres en el volumen, que, a su vez, se determina a partir de los campos BPB. En primer lugar, se calcula el número de sectores del directorio raíz:

RootDirSectors = (BPB_RootEntCnt * 32) / BPB_BytsPerSec

A continuación, se determina cuáles de los campos BPB_FATSz16/32 y BPB_TotSec16/32 no son iguales a cero, y se utilizan para determinar el número de sectores del área de datos de volumen:

DataSec = TotSec - (BPB_ResvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors)

Finalmente, se determina el número de grupos de áreas de datos:

CountofClusters = DataSec / BPB_SecPerClus

Por el número de clústeres, existe una correspondencia uno a uno con el sistema de archivos:

  • Recuento de clústeres < 4085 - FAT12
  • Recuento de clústeres = 4085 ÷ 65524 - FAT16
  • Recuento de clústeres > 65524 - FAT32

Según la especificación oficial, esta es la única forma válida de determinar el tipo de FAT. La creación artificial de un volumen que infrinja las reglas de asignación especificadas hará que Windows lo maneje incorrectamente. Sin embargo, se recomienda evitar valores de CountofClusters que estén cerca de los valores críticos (4085 y 65525) para determinar correctamente el tipo de sistema de archivos por cualquier controlador, a menudo escrito incorrectamente.

FAT12 siempre se crea en un disquete cuando se formatea . En cuanto a los discos duros y las unidades flash , con un tamaño de unidad de hasta 512 MB (con un sector de 512 bytes), FAT16 se crea de forma predeterminada, más de 512 MB - FAT32. El tamaño del clúster se determina durante el formateo según el sistema de archivos y el tamaño del volumen.

Número de serie del volumen

El número de serie del volumen (el campo BS_VolID) en Windows 98 se crea a partir del formato de fecha y hora de tal manera que es imposible restaurarlos sin información adicional.

Tabla FAT

La siguiente estructura importante de un volumen FAT es la propia tabla FAT, que ocupa un área lógica separada. Define una lista (cadena) de clústeres que alojan los archivos y carpetas del volumen. Hay una correspondencia de uno a uno entre los clústeres y los punteros de índice de la tabla: el puntero N corresponde al clúster con el mismo número. Al primer grupo del área de datos se le asigna el número 2. El valor del puntero de índice corresponde al estado del grupo correspondiente. Son posibles los siguientes estados:

  • el grupo está libre: el puntero está en cero;
  • el grupo está ocupado por un archivo y no es el último grupo de archivos: el puntero contiene el número del siguiente grupo de archivos;
  • el clúster es el último clúster del archivo: el puntero contiene la etiqueta EOC (End Of Clusterchain), cuyo valor depende de la versión FAT: para FAT12, la etiqueta EOC es cualquier valor mayor o igual a 0x0FF8 (0x0FFF por defecto); para FAT16 — mayor o igual a 0xFFF8 (predeterminado 0xFFFF); para FAT32, cualquier valor mayor o igual a 0x0FFFFFF8 (0x0FFFFFFF por defecto);
  • el clúster está dañado: el puntero contiene una etiqueta especial, cuyo valor es 0x0FF7 para FAT12, 0xFFF7 para FAT16 y 0x0FFFFFF7 para FAT32. El sistema de archivos no puede utilizar un clúster dañado para el almacenamiento de datos; los punteros correspondientes no se ven afectados al formatear el volumen, cuando todos los demás punteros se establecen en cero;
  • el clúster está reservado "para estandarización futura": el puntero contiene un valor mayor que CountofClusters, pero menor que la etiqueta del clúster dañado (es decir, hasta 0xFFF6 inclusive para FAT16). En este caso, el clúster, que no corresponde a ningún dato real, se considera ocupado y se salta cuando se busca uno libre, pero no se proporciona ninguna otra información al respecto.

Los clústeres 0 y 1 se reflejan por separado en FAT. El puntero de índice correspondiente al clúster cero (el primer puntero de la tabla FAT) contiene el valor de BPB_Media en los 8 bits inferiores; los bits restantes se establecen en 1. Por ejemplo, si BPB_Media = 0xF8 (disco duro), FAT[0] = 0x0FFFFFF8 para FAT32. Por lo tanto, formalmente FAT[0] = EOC, que se usa cuando se procesan archivos de tamaño cero (ver más abajo).

El segundo puntero reservado, FAT[1], se establece en el valor de la marca EOC al formatear. En FAT12, ya no se usa de ninguna manera, y en FAT16 y FAT32, los dos bits superiores de este puntero pueden contener una marca sobre la necesidad de verificar el volumen (el llamado " bit sucio "), y todos los demás los bits se establecen en 1. La presencia de un bit sucio se verifica durante el proceso de arranque de Windows del programa autochk.exe. El bit sucio se genera cuando el volumen no se desmonta correctamente o cuando el medio tiene un error de hardware y, en consecuencia, toma dos valores posibles.

Un puntero de índice FAT32 tiene, por definición, 32 bits, pero los 4 bits superiores en realidad se ignoran, por lo que el valor del puntero es, de hecho, 28 bits. La única operación que opera en los 4 bits superiores del puntero es el formato de volumen, que restablece todo el puntero. Esto significa que, por ejemplo, los valores de puntero 0x10000000, 0xF0000000 y 0x00000000 corresponden a un clúster libre, ya que solo difieren en los 4 bits superiores.

El valor del tamaño de la tabla BPB FAT, es decir, BPB_FATSz16/32, puede ser mayor que el real, por lo que puede haber sectores al final de cada tabla FAT que no correspondan a ningún clúster de datos real. Durante el formateo, estos sectores se restablecen a cero, y durante la operación del volumen, no se utilizan de ninguna manera. Por lo tanto, la dirección real del último sector de la tabla FAT, que contiene punteros a clústeres de volumen real, siempre debe calcularse a partir del número total de clústeres de área de datos y no del campo BPB_FATSz16/32. Además, el último sector ocupado por la tabla FAT no necesariamente está completamente ocupado por ella; en este caso, el espacio sobrante del sector tampoco se usa y se llena con ceros al formatear el volumen.

Archivo de registros

Inmediatamente después del final de la última tabla FAT hay un área de datos que contiene archivos y carpetas. Un directorio FAT es un archivo normal marcado con un atributo especial. Los datos (contenido) de dicho archivo en cualquier versión FAT es una cadena de registros de archivo de 32 bytes (registros de directorio). Normalmente, un directorio no puede contener dos archivos con el mismo nombre. Si el programa de comprobación de disco encuentra un par de archivos creados artificialmente con nombres idénticos en el mismo directorio, se cambia el nombre de uno de ellos.

Directorio raíz

El único directorio que debe estar presente es el directorio raíz. En FAT12/FAT16, el directorio raíz tiene un tamaño fijo en sectores, que se calcula a partir del valor de BPB_RootEntCnt y sigue la tabla FAT en el disco.

En FAT32, el directorio raíz, como cualquier otro, tiene un tamaño variable y es una cadena de clústeres. El número del primer clúster de directorio raíz se refleja en BPB_RootClus. El directorio raíz difiere de otros directorios en un volumen FAT de las siguientes maneras:

  • no tiene sellos de fecha y hora;
  • sin nombre propio (excepto "\");
  • no contiene archivos llamados "." y ".." (ver más abajo);
  • es el único directorio que normalmente puede contener un archivo de etiqueta de volumen (ver más abajo).
Estructura de un registro de archivo

Un registro de archivo FAT32 consta de las siguientes estructuras:

  • DIR_Nombre. El campo de 11 bytes en la dirección relativa 0 contiene el nombre de archivo corto (bajo el estándar 8.3). Consulte a continuación los nombres de archivo.
  • DIR_Atributo Byte en la dirección 0x0B, responsable de los atributos del archivo.
  • DIR_NTRes. Byte en la dirección 0x0C, utilizado en Windows NT.
  • DIR_CrtTimeTenth. Byte en la dirección 0x0D. Recuento de decenas de milisegundos del tiempo de creación del archivo, los valores válidos son 0–199. El campo a menudo se ignora innecesariamente.
  • DIR_CrtTime. 2 bytes en la dirección 0x0E. Tiempo de creación del archivo con una precisión de 2 segundos.
  • DIR_CrtDate. 2 bytes en la dirección 0x10. La fecha en que se creó el archivo.
  • DIR_LstAccDate. 2 bytes en la dirección 0x12. La fecha del último acceso al archivo (es decir, la última lectura o escritura; en este último caso, es igual a DIR_WrtDate). No existe un campo similar para el tiempo.
  • DIR_FstClusHI. 2 bytes en la dirección 0x14. El primer número de clúster del archivo (palabra alta, cero en un volumen FAT12/FAT16).
  • DIR_WrtTime. 2 bytes en la dirección 0x16. Hora de la última grabación (modificación) del archivo, por ejemplo, su creación.
  • DIR_WrtDate. 2 bytes en la dirección 0x18. La fecha de la última grabación (modificación) del archivo, incluida la creación.
  • DIR_FstClusLO. 2 bytes en la dirección 0x1A. Número del primer grupo del archivo (palabra baja).
  • DIR_Tamaño de archivo. DWORD que contiene el valor del tamaño del archivo en bytes. La limitación fundamental de FAT32 es que el tamaño de archivo máximo permitido es 0xFFFFFFFF (es decir, 4 GB menos 1 byte).

Si el primer byte de una entrada FAT (es decir, DIR_Name[0]) contiene 0xE5 o 0x05, significa que la entrada está libre (se ha eliminado el archivo correspondiente). Cero en DIR_Name[0] significa que no solo esta entrada está libre, sino también todas las entradas de directorio posteriores; Windows no analiza el resto de un directorio después de una entrada puesta a cero.

Nombre de archivo en FAT

El campo DIR_Name se divide lógicamente en los primeros 8 caracteres, que forman el nombre del archivo, y los últimos 3, que forman la extensión. El punto de separación se agrega en el nivel del sistema operativo y no se almacena en el campo de nombre. Si el nombre y la extensión del archivo no llenan el espacio asignado para ellos, los bytes restantes del campo DIR_Name se llenan con espacios (0x20). El nombre y la extensión del archivo pueden contener cualquier combinación de letras, números o caracteres con códigos ASCII superiores a 127; Los caracteres especiales se dividen en tres grupos:

  • Permitido: ! # $ % & () - @ ^ _ ` { } ~ '
  • Prohibido: +.; =[]
  • Servicio: * ? <: > / \ | "

Los caracteres de servicio tienen un significado especial en DOS y Windows y no pueden formar parte de un nombre de archivo (los signos * ? son metacaracteres y los signos : / \ se utilizan como separadores en las rutas de los archivos , otros caracteres de servicio e ilegales son caracteres de control en los intérpretes de línea de comandos COMMAND.COM y cmd.exe ), mientras que los caracteres prohibidos aún se pueden incluir en el nombre del archivo al costo de una entrada LFN (ver más abajo). Por ejemplo, se puede crear un directorio con un nombre que comience con un punto o que contenga varios puntos en el modo de línea de comando ( mkdir .directory) o en shells como FAR Manager , Total Commander , WinRAR . El nombre del archivo no puede comenzar ni terminar con un espacio; no se permiten caracteres de control ASCII ( es decir, 0x00-0x1F) en ningún byte del campo de nombre, excepto en el caso del código 5 especificado anteriormente . guardado, por lo que el acceso a archivos cuyos nombres contienen códigos nacionales de ASCII extendido (por ejemplo, caracteres cirílicos de la página de códigos 866 ), con una página de códigos diferente, puede ser problemático o imposible (porque antes de buscar un archivo en el directorio, su el nombre se convierte a mayúsculas de acuerdo con la tabla establecida en la página de códigos). La ruta completa al archivo no puede exceder los 80 bytes (3 es la letra de la unidad; 64 es la ruta; 12 es el nombre del archivo, incluido el punto delimitador; 1 es el signo nulo del terminal).

Los 8.3 caracteres alfabéticos del nombre siempre se traducen y almacenan en el campo DIR_Name en mayúsculas. El byte DIR_NTRes se usa para conservar el caso original de un nombre de Windows NT : un 1 en el bit 3 indica que el nombre debe mostrarse en minúsculas; El responsable de la extensión es el bit 4. Si el nombre o la extensión contienen caracteres de ambos casos, se crea un registro LFN para dicho archivo (ver más abajo). Windows 9x siempre crea una entrada LFN para preservar el caso no trivial del nombre e ignora el campo DIR_NTRes. Como consecuencia, el nombre del mismo archivo, sin una entrada LFN asociada, puede mostrarse en Windows 9x completamente en mayúsculas, pero en Windows NT (parcialmente) en minúsculas.

Atributos de archivo

En el byte de atributo, los dos bits superiores están reservados y siempre deben establecerse en cero. Los bits restantes se distribuyen de tal manera que el valor 0x01 corresponde al atributo "solo lectura", 0x02 - "oculto", 0x04 - "sistema", 0x20 - "archivado". Un conjunto de varios atributos se forma sumando los valores básicos. Además de estos atributos estándar, se utilizan los siguientes: 0x10: indica que el archivo es un directorio (contenedor para otros archivos); 0x08: ATTR_VOLUME_ID, un atributo especial de un archivo único de tamaño cero en el directorio raíz, cuyo nombre se considera una etiqueta de volumen. El límite de la etiqueta de volumen FAT de 11 caracteres está relacionado con el tamaño del campo DIR_Name. Si el archivo tiene READ_ONLY | OCULTO | SISTEMA | VOLUME_ID (valor 0x0F), esto indica que la entrada no corresponde a un archivo separado, sino que contiene parte de un nombre largo de otro archivo que no se ajusta al marco 8.3 (ver más abajo).

Se utiliza una asignación artificial de un valor distinto de cero a los dos bits superiores de DIR_Attr para formar archivos que no se pueden eliminar o renombrar por medios estándar del sistema de archivos sin formatear. Esto es útil, por ejemplo, cuando se combaten los virus Autorun.inf (Panda USB y el programa AutoRun Vaccine). Por otro lado, los propios virus pueden utilizar la misma herramienta. El valor de DIR_Attr = 0x40 está reservado para uso interno (dispositivo).

Qué sucede cuando se crea un directorio

Cuando se crea un directorio, se establece "de por vida" DIR_FileSize = 0. El tamaño del contenido del directorio se determina simplemente siguiendo las cadenas de grupos hasta la marca End Of Chain. El tamaño del directorio en sí está limitado por el sistema de archivos a 65 535 entradas de 32 bytes (es decir, las entradas de directorio en la tabla FAT no pueden exceder los 2 MB). Este límite tiene por objeto acelerar las operaciones de archivo y permitir que varias utilidades utilicen un número entero de 16 bits (PALABRA) para contar la cantidad de entradas en un directorio (como resultado, existe un límite teórico en la cantidad de archivos en un directorio). - 65.535, siempre que todos los nombres de archivo sigan el estándar 8.3). Al directorio se le asigna un clúster de área de datos (a menos que sea un directorio raíz FAT12/FAT16) y los campos DIR_FstClusHI / DIR_FstClusLO se establecen en el valor de ese número de clúster. Se coloca una etiqueta EOC en la tabla FAT para la entrada correspondiente a este grupo, y el propio grupo se llena con ceros. A continuación, se crean dos archivos especiales, sin los cuales el directorio FAT se considera dañado (las dos primeras entradas de 32 bytes en el área de datos del clúster): archivos de tamaño cero con los nombres "." (un punto, identificador de directorio) y ".." (dos puntos, puntero al directorio principal). Las marcas de fecha y hora de estos archivos se establecen en los valores del propio directorio en el momento de la creación y no se actualizan cuando cambia el directorio. Los campos DIR_FstClusHI / DIR_FstClusLO del "." contiene el valor del número del grupo que lo contiene, y el archivo ".." - el número del primer grupo del directorio que contiene el dado. Así, el archivo "." se refiere al directorio en sí, y el archivo ".." se refiere al grupo inicial del directorio principal; si el directorio principal es el directorio raíz, se considera que el clúster inicial es cero.

Hora y fecha

Un sello de fecha de dos bytes tiene el siguiente formato:

  • bits 0-4 — día del mes, se permiten valores 1-31;
  • bits 5–8 — mes del año, se permiten valores 1–12;
  • bits 9-15 - año, contando desde 1980 ("época de MS-DOS"), son posibles valores de 0 a 127 inclusive, es decir, 1980-2107.

Una marca de tiempo de dos bytes tiene el siguiente formato:

  • bits 0-4 - contador de segundos (dos cada uno), los valores válidos son 0-29, es decir, 0-58 segundos;
  • los bits 5-10 son minutos, los valores válidos son 0-59;
  • los bits 11-15 son horas, los valores válidos son 0-23.

De las marcas de fecha y hora, solo la hora de la última modificación (es decir, DIR_WrtTime y DIR_WrtDate) es crítica, el resto puede no ser compatible con muchos sistemas; cuando se opera en un archivo en un sistema de este tipo (por ejemplo, en DOS o Windows 3.1), estos campos se ignoran. FAT guarda sellos de fecha y hora de acuerdo con la zona horaria local; cuando cambia, las marcas no cambian.

Las marcas de tiempo para los directorios se establecen cuando se crean y no cambian cuando se escriben nuevos archivos en un directorio, se les cambia el nombre o se les asigna un nuevo clúster.

La fecha del último acceso al archivo se actualiza cada vez que se accede, por ejemplo, al ver las propiedades del archivo, al pasar a otro volumen (pero no dentro del volumen). Cuando copia un archivo en Windows 98, se actualiza la última fecha de acceso del archivo original, pero no en Windows XP.

La fecha y hora de modificación del archivo cambia cada vez que se escribe contenido nuevo en el área de datos (no en el registro del archivo). En otras palabras, la fecha y hora de modificación no cambia cuando se cambian los atributos o se cambia el nombre del archivo. Mover o copiar un archivo conserva la marca de modificación original.

La fecha y la hora de creación se establecen cuando se asigna un registro de archivo para un nuevo archivo que no existía antes. En otras palabras, cuando se cambia el nombre o se mueve un archivo, la fecha y la hora de creación no cambian, pero cuando se copia, el nuevo archivo recibe un nuevo sello. Por lo tanto, al copiar un archivo en Windows, puede terminar con una fecha de creación posterior a la fecha de modificación.

Registros LFN

Los archivos y directorios con un nombre largo (superior a 8.3) son tratados de manera especial por el sistema de archivos FAT. La estructura de un registro de 32 bytes para un archivo con un LFN (nombre de archivo largo) es diferente de un registro normal (SFN):

  • LDIR_Ord. El primer byte de una entrada se utiliza para numerar las entradas del conjunto.
  • LDIR_Nombre1. El campo de 10 bytes en la dirección 0x01 contiene los primeros cinco caracteres del nombre del archivo (o más bien, la parte de su nombre que se refleja en este registro LFN).
  • LDIR_Atributo El byte de atributo en la dirección 0x0B es 0x0F (ATTR_LONG_NAME).
  • LDIR_Tipo. El byte en la dirección 0x0C se establece en cero y, además, indica que esta entrada en la tabla FAT hace referencia a un archivo con un nombre largo.
  • LDIR_Chksum. El byte en la dirección 0x0D contiene la suma de comprobación SFN del alias de archivo correspondiente al conjunto de registros LFN.
  • LDIR_Nombre2. Un campo de 12 bytes en la dirección 0x0E que contiene los caracteres del 6 al 11 del nombre del archivo.
  • LDIR_FstClusLO. El campo de 2 bytes en la dirección 0x1A no tiene sentido en el contexto de un registro LFN y se establece en cero.
  • LDIR_Nombre3. Un campo de 4 bytes en la dirección 0x1C que contiene los caracteres 12 y 13 del nombre del archivo.

Un conjunto de entradas LFN en un directorio FAT siempre debe estar asociado con una entrada SFN normal que esté precedida físicamente en el disco. Un conjunto de registros LFN que se encuentra sin un registro normal correspondiente se denomina huérfano y el registro se considera corrupto; dicho archivo es completamente invisible en versiones anteriores de MS-DOS/Windows.

En una secuencia de registros LFN, cada uno de ellos tiene su propio número de serie, determinado por el primer byte (LDIR_Ord). La máscara 0x40 indica que esta entrada es la última en la fila de entradas LFN que la siguen (es decir, por ejemplo, para la tercera entrada LFN en la fila, el valor del byte LDIR_Ord será 0x43, para el 17 - 0x51 ). En registros subsiguientes, este byte cambia de N para el N-ésimo registro "largo" en la cuenta del normal correspondiente a 1 para el registro más cercano al normal.

Los nombres de archivo largos se almacenan en codificación Unicode ( UTF-16 ), preservando el caso de los caracteres alfabéticos ingresados. Si un determinado carácter de nombre OEM o Unicode no se puede convertir en un carácter de página de códigos, siempre se muestra como el carácter de subrayado "_" y el carácter real almacenado en el disco no cambia.

El byte de suma de verificación se calcula de acuerdo con un cierto algoritmo basado en el nombre 8.3 de un registro regular (para un archivo con un nombre largo, el "nombre" de un registro regular se llama alias - alias) y se copia a todos los "largos". "registros que le corresponden. Si alguno de los valores no coincide con el nombre del archivo (por ejemplo, si se cambió el nombre del archivo en una versión anterior de MS-DOS/Windows), se produce un huérfano.

Un alias de archivo SFN con un nombre largo consta de un cuerpo y, si es necesario, una "cola" digital. Si el archivo tiene una extensión, sus primeros tres caracteres se almacenan en el alias. El nombre correspondiente se forma traduciendo los caracteres del nombre de archivo largo a la codificación OEM, se ignoran todos los espacios del nombre largo y los caracteres que no son traducibles en el OEM o están prohibidos en el contexto del nombre corto se reemplazan con un guión bajo "_". La cola de dígitos "~n", donde n = 1 ÷ 999999, se agrega al alias si el alias obtenido originalmente entraba en conflicto con el nombre de cualquier archivo en el mismo directorio o era más largo que lo que define el estándar 8.3, o si algún carácter cuando el cambio de codificación no encontró una contraparte OEM y fue reemplazado por un guión bajo. Por lo tanto, se forman alias como NEWFIL~1.DJV (LFN = Nuevo archivo para mí.djvu). El esquema de alias de archivo está optimizado para la velocidad y, por lo tanto, es impredecible en detalle.

Un nombre de archivo que no es un múltiplo de 13 caracteres no llena completamente los campos de nombre de las entradas LFN en la tabla FAT. En este caso, el nombre del archivo termina artificialmente con un carácter NUL (0x00) y los bytes sobrantes se obstruyen con unos (es decir, con caracteres 0xFF).

Para nombres largos, la longitud del nombre está limitada a 255 caracteres, sin contar el separador NUL, y la ruta completa está limitada a 260 caracteres, incluido NUL. El nombre largo también permite el uso de seis caracteres especiales que están prohibidos en los nombres cortos: +,; =[]

Si intenta crear un archivo o directorio en un volumen FAT32 con un nombre que contenga dicho carácter, se generará automáticamente una entrada LFN, independientemente de la longitud del nombre del archivo. Un proceso similar ocurre al crear un archivo/carpeta con un nombre que contiene caracteres que no son ASCII.

Es posible que el archivo de etiquetas de volumen no preceda físicamente a todas las entradas del volumen con nombres largos (cuando el volumen no tiene una etiqueta o la etiqueta se asignó después de que se escribiera algún archivo con un nombre largo). Entonces la etiqueta del volumen en FAT12/FAT16 no se mostrará correctamente, ya que se tomará del registro LFN más cercano (porque también tiene el atributo VOLUME_ID), y si intenta cambiar la etiqueta del volumen, el nombre del archivo correspondiente será efectivamente violado. Al eliminar un archivo que tiene registros LFN asociados, estos últimos no se ven afectados y quedan huérfanos. Durante la creación posterior de un nuevo archivo, el huérfano mencionado puede asociarse erróneamente con él si las sumas de verificación de los nombres de los archivos antiguo y nuevo coinciden, sin embargo, el algoritmo de cálculo de suma de verificación utilizado (el código ASCII del primer carácter del archivo alias se desplaza cíclicamente un bit a la derecha y se añade el código del carácter siguiente, etc. d) hace despreciable esta probabilidad.

Significado de las operaciones de archivos en FAT

Formato de volumen  : la tabla de punteros de índice se restablece a cero, excepto los tres primeros (FAT[0] y FAT[1], están reservados, y FAT[2] contiene una entrada correspondiente al archivo de etiquetas de volumen o, si falta, la etiqueta EOC) y registros de racimos dañados; las entradas del directorio raíz se establecen en cero (excepto el archivo de etiquetas de volumen, si lo hay); de lo contrario, el área de datos no se ve afectada.

Eliminación de archivos  : el primer carácter del registro del archivo y todos los registros LFN asociados se reemplaza por el código 0xE5; los clústeres ocupados por el archivo se marcan como libres en la tabla FAT, pero los clústeres del área de datos no se ven afectados.

Crear un archivo o directorio con el comando "Nuevo" del menú contextual: se crea una entrada de archivo para un nuevo archivo "vacío" con un nombre predeterminado (por ejemplo, "Nueva carpeta") y un tamaño determinado por el tipo de archivo; el archivo en sí, si tiene un tamaño distinto de cero (lo cual es cierto para casi todos los archivos "vacíos", excepto directorios y documentos de texto), se escribe en el área de datos en los grupos que se le asignan; la cadena de clúster correspondiente se crea en la tabla FAT. Después de dar al archivo un nombre válido (no el predeterminado), la entrada del archivo creada originalmente se marca como eliminada y se crea una nueva.

Cambiar el nombre de un archivo  : se crea una nueva entrada con un nombre actualizado; la entrada anterior se marca como eliminada.

Guardar un archivo desde la aplicación (no desde la línea de comandos): se crea un registro que contiene todos los campos excepto el tamaño y el grupo inicial del archivo; después de guardar el archivo, se crea un nuevo registro que contiene todos los campos y se elimina el registro anterior.

Copiar un archivo  : se crea un registro de archivo idéntico en la nueva ubicación (posiblemente excepto por algunas marcas de tiempo, consulte más arriba), el primer clúster libre se asigna al archivo y el contenido del archivo se copia en la nueva ubicación, mientras se copia el clúster actual, buscando el siguiente libre y llenando la tabla FAT.

Mover un archivo (entre diferentes volúmenes): copiar y luego eliminar el archivo de su ubicación original.

Reubicación de archivos (dentro del volumen): la cadena de clústeres no se ve afectada, el registro del archivo se copia sin cambios en el nuevo directorio y luego se elimina del anterior.

La búsqueda de un clúster libre en la tabla de punteros de índice para la asignación a un nuevo archivo generalmente comienza no desde el comienzo del área de datos (es decir, desde el clúster 2), sino desde el último clúster asignado a cualquier archivo, el número de que se almacena en la estructura FSInfo. En otras palabras, si al archivo 1 se le asignó el clúster 30, y al archivo 2 se le asignó el clúster 31, y luego se eliminó el archivo 1, cuando se cree un nuevo archivo 3, lo más probable es que se encuentre físicamente a partir del clúster 32.

Tolerancia a fallos del sistema

Dado que el sistema FAT almacena datos sobre archivos y datos sobre espacio libre en disco en la misma tabla, la operación de escritura de archivos, que tradicionalmente consta de dos etapas (agregar el bloque ocupado a la lista de ocupados y eliminar el mismo bloque de la lista de los libres), ocurre en FAT en una sola acción. Debido a esto, el sistema FAT tiene una tolerancia a fallas inherente, es decir, una falla (por ejemplo, energía) en el momento de una operación de lectura o escritura en la mayoría de los casos no conducirá a la destrucción del sistema de archivos. Sin embargo, en este caso, estamos hablando de la integridad del sistema de archivos y no de los archivos en sí.

Características [3]

FAT12 FAT16 FAT32
Desarrollador microsoft
Título completo Tabla de asignación de archivos
(versión de 12 bits) (versión de 16 bits) (versión de 32 bits)
presentado 1980 ( Microsoft Disk BASIC ) Agosto de 1984 ( MS-DOS 3.00, truncado)
completo - julio de 1988, MS-DOS 4.0 [6]
Agosto de 1996 (Windows 95 OSR 2)
Id. de volumen 0x01 ( MBR ) 0x04, 0x06, 0x0E (MBR) 0x0B, 0x0C (MBR)
EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 ( GPT )
estructuras
Contenido del directorio Mesa
Colocación de archivos Lista lineal
Bloques defectuosos Etiquetado de clústeres
Restricciones
tamaño del archivo 32 MB _ 2 GB _ 4 GB
Número de clústeres 4084 65 524 268 435 445 (2 28 −12)
Longitud del nombre del archivo 8,3 o 255 caracteres cuando se usa LFN
Tamaño del volumen 2 MB (512 bytes por sector)

32 MB (64 KB por clúster)

2 GB
4 GB (64 KB por clúster, no se admite en todas partes)
2 TB
8 TB (32 KB por sector)
Capacidades
fechas almacenadas Creación, modificación, acceso
Rango de fechas 1 de enero de 1980 - 31 de diciembre de 2107
Información Adicional Inicialmente no compatible
Atributos de archivo Solo lectura, oculto, sistema, etiqueta de volumen, subdirectorio, archivo
Diferenciación de derechos de acceso No
Compresión transparente Utilidades independientes ( Stacker , DoubleSpace , DriveSpace )
Cifrado transparente Utilidades de terceros o clones de DOS

Licencias

Algunos algoritmos para trabajar con FAT y VFAT están patentados por Microsoft.

En los Estados Unidos en reconsideración[ ¿cuándo? ] se decidió cancelar algunas de las patentes, pero luego se canceló.

En octubre de 2006, una patente para VFAT emitida por la Oficina Europea de Patentes [7] fue cancelada en Alemania por obviedad .

Con el tiempo, FAT se volvió ampliamente utilizado en varios dispositivos para la compatibilidad entre DOS, Windows, OS / 2, Linux. Microsoft no ha mostrado intención de obligarlos a licenciar[ aclarar ] [8] .

En febrero de 2009, Microsoft demandó a TomTom , un fabricante de sistemas de navegación para automóviles basados ​​en Linux , por infracción de patente [9] .

Según Jeremy Ellison[ aclarar ] El objetivo de Microsoft es presentar a varias empresas una opción: celebrar un acuerdo de protección de patentes con Microsoft (como el que Novell celebró con ella en noviembre de 2006), violando así la GPL de GNU y haciendo imposible para ellas usar Linux , o no celebrar dicho acuerdo y ser acusado de infringir patentes, cuya protección se proporciona tras su celebración bajo la condición de no divulgación [10] [11] .

En marzo de 2009, TomTom presentó una reconvención por infracción de patente [12] .

Véase también

Notas

  1. Copia archivada . Consultado el 9 de junio de 2009. Archivado desde el original el 16 de julio de 2011.
  2. www.microsoft.com/mscorp/ip/tech/fathist.asp en archive.org
  3. 1 2 Microsoft Extensible Firmware Initiative FAT32 File System Specification 1.03 (enlace no disponible) . Microsoft (6 de diciembre de 2000). — Documento en formato Microsoft Word, 268 Kb. Consultado el 5 de abril de 2010. Archivado desde el original el 22 de agosto de 2011. 
  4. ¿Qué pasa con VFAT? (enlace no disponible) . Archivo de TechNet . Microsoft (15 de octubre de 1999). Consultado el 5 de abril de 2010. Archivado desde el original el 22 de agosto de 2011. 
  5. No confunda la extensión del sistema de archivos VFAT con el controlador del sistema de archivos del mismo nombre, que apareció en Windows for Workgroups 3.11 y está diseñado para procesar llamadas a funciones de MS-DOS (INT 21h) en modo protegido (consulte: KB126746: Windows for Workgroups 3.11). Historial de versiones de grupos de trabajo (no disponible (enlace) VERSIÓN 3.11 → Funciones fuera de la red Microsoft (14 de noviembre de 2003) Consultado el 5 de abril de 2010. Archivado desde el original el 22 de agosto de 2011.  )
  6. Resumen de partición de MS-DOS (enlace descendente) . microsoft.com . Consultado el 23 de octubre de 2012. Archivado desde el original el 23 de octubre de 2012. 
  7. El Tribunal Federal de Patentes declara nula y sin efecto la patente FAT de Microsoft  (inglés)  (enlace no disponible) . Heise en línea . Heise Zeitschriften Verlag (2 de marzo de 2007). Consultado el 10 de marzo de 2009. Archivado desde el original el 22 de agosto de 2011.
  8. Brian Kahin. Microsoft Roils the World con patentes FAT  (inglés)  (enlace no disponible) . The Huffington Post (10 de marzo de 2009). Consultado el 10 de marzo de 2009. Archivado desde el original el 22 de agosto de 2011.
  9. Ryan Paul. La demanda de Microsoft por las patentes FAT podría abrir la Caja de Pandora de OSS  (ing.)  (enlace no disponible) . Ars Technica . Publicaciones de Condé Nast (25 de febrero de 2009). Consultado el 9 de marzo de 2009. Archivado desde el original el 22 de agosto de 2011.
  10. Glyn Moody. La razón real de la demanda de TomTom de Microsoft  (inglés)  (enlace no disponible) . mundo informático Reino Unido . IDG (5 de marzo de 2009). Consultado el 9 de marzo de 2009. Archivado desde el original el 22 de agosto de 2011.
  11. Steven J. Vaughan-Nichols. Empresas Linux firman pactos de protección de patentes de Microsoft  (ing.)  (enlace no disponible) . Blogs del mundo de la informática . IDG (5 de marzo de 2009). Consultado el 9 de marzo de 2009. Archivado desde el original el 22 de agosto de 2011.
  12. Erica Ogg. TomTom contrademanda a Microsoft en disputa de patente  (ing.)  (enlace no disponible) . CNet (19 de marzo de 2009). Consultado el 20 de marzo de 2009. Archivado desde el original el 22 de agosto de 2011.

Enlaces