Los niveles llamados Sistema de Ficheros Básico y Sistema de Ficheros Simbólico se apoyan ambos en unos servicios que implementan un disco virtual. Estos servicios se suministran en el llamado Sistema de Bloques Físicos (SBF).
Dada su simplicidad, el SBF no constituye una práctica en sí mismo, aunque tres de los trabajos propuestos (Caché, S.F. Básico y S.F. Simbólico) han de utilizar sus servicios. Para ello se ha dispuesto un fuente en C con una implementación simple del SBF.
El disco virtual se define como un conjunto de bloques físicos contiguos de tamaño fijo, como muestra el diagrama. Los bloques físicos están numerados de cero en adelante.
El primer bloque de un disco virtual se llama superbloque y contiene una serie de campos que informan de las características del disco (longitud, tamaño de sector, etc.)
El superbloque sólo se puede utilizar para leer o escribir esta información. No se pueden utilizar los campos del superbloque con fines distintos a los que fueron pensados.
Así pues, el primer bloque físico realmente utilizable es el número 1 (uno), ya que el bloque cero tiene una finalidad específica: es el superbloque.
Los campos del superbloque se muestran en este esquema, en el mismo orden en que se guardan en el disco.
char magico[8]
|
Cadena
de caracteres para verificar el formato
|
WORD
tam_bloque_fisico
|
Tamaño
en bytes de un bloque físico
|
DWORD
num_bloques_fisicos
|
Cantidad
total de bloques físicos
|
WORD
BF_bloque_datos
|
Bloques
físicos por cada bloque de datos
|
WORD
bytes_bloque_datos
|
Tamaño
efectivo en bytes de un bloque de datos
|
DWORD
num_BF_reservados
|
Bloques
físicos reservados por el SFS
|
WORD
tam_BFB
|
Tamaño
en bytes de un bloque de fichero básico
|
WORD
num_BFB
|
Número
de BFBs reservados
|
WORD
tam_DFE
|
Tamaño
en bytes de un DFE
|
Los distintos niveles del sistema de ficheros utilizarán y, en su caso, alterarán estos campos, según lo descrito en cada capítulo de este documento.
El único campo que es pertinente resaltar ahora es magico. Este campo es una cadena de ocho caracteres cuyo único propósito es dar un indicio de que el archivo UNIX puede ser un sistema de ficheros de esta práctica. Se supone que todos los discos formateados en las prácticas deberían tener la misma cadena en magico. El valor que se propone en los ficheros de interfaz es "SOPA123", que pueden cambiar para diferenciar sus sistemas de ficheros de los de otros compañeros, o entre distintas versiones de sus mismos programas.
Para manipular cómodamente el superbloque, se dispone de un tipo de datos, struct Superbloque, que se define en el fichero de interfaz <superblq.h>
Además, el Sistema de Bloques Físicos implementa sendas funciones para leer y escribir el superbloque: LeeSuperbloque y EscribeSuperbloque.
Todos los accesos al disco virtual en esta práctica se han de basar en estas funciones, que aparecen en el fichero cabecera <sbfisico.h>
/* Instalación y montaje de discos */
int InstalaDisco ( const char* nombre_fichero,
WORD tam_bloque, DWORD num_bloques );
int MontaDisco ( const char* nombre_fichero, int nbloques_cache );
int DesmontaDisco (void);
/* Acceso al superbloque */
int LeeSuperbloque ( struct Superbloque* bloque );
int EscribeSuperbloque ( const struct Superbloque* bloque );
/* Lectura y escritura de bloques físicos */
int LeeBloqueFisico ( DWORD nbloque, void* bufer );
int EscribeBloqueFisico ( DWORD nbloque, void* bufer );
A continuación se detallan las especificaciones de las funciones del Sistema de Bloques Físicos.
int InstalaDisco ( const char* nombre_fichero,
WORD tam_bloque, DWORD num_bloques );
Esta función crea un fichero de nombre nombre_fichero, estructurado como Sistema de Bloques Físicos, conteniendo num_bloques bloques físicos, cada uno con un tamaño en bytes igual a tam_bloque.
La función se encarga de crear un superbloque con los valores adecuados en los campos magico, tam_bloque_fisico y num_bloques_fisicos.
La función devuelve un -1 en caso de error, depositando en la variable Error_SF el código de error, que puede ser:
ERR_DISCO
|
Error
al intentar crear el fichero UNIX
|
ERR_RANGO
|
Parámetros
fuera de rango
|
ERR_ESPACIO
|
No
había espacio suficiente en disco
|
int MontaDisco ( const char* nombre_fichero, int nbloques_cache );
Esta función monta el fichero nombre_fichero para su uso como Sistema de Bloques Físicos. nombre_fichero debió haber sido creado previamente con la función InstalaDisco. Sólo puede haber un disco montado.
El parámetro nbloques_cache indica cuántos bloques de desea que contenga la caché de bloques físicos. El sistema de caché intentará habilitar una caché de ese tamaño; si no es capaz se creará una caché con el máximo tamaño que sea posible.
La función devuelve un -1 en caso de error, depositando el código de error en Error_SF. Algunos errores posibles son:
ERR_NOEXISTE
|
El
fichero UNIX no existe
|
ERR_DISCO
|
Error
con el fichero UNIX
|
ERR_MONTADO
|
Ya
hay un SBF montado
|
ERR_FORMATO
|
El
fichero no tiene formato de SBF
|
int DesmontaDisco (void);
Desmonta el disco actualmente en uso. Esta función devuelve un -1 en caso de error. El código de error que se guarda en Error_SF puede ser:
ERR_DISCO
|
Error
con el fichero UNIX
|
ERR_INACTIVO
|
No
hay ningún SBF montado
|
int LeeSuperbloque ( struct Superbloque* bloque );
int EscribeSuperbloque ( const struct Superbloque* bloque );
Estas dos funciones se encargan, respectivamente, de leer y escribir el superbloque del SBF montado. Las transferencias se efectúan sobre la estructura apuntada por bloque.
Ambas funciones devuelven un -1 si se ha producido un error. Los valores posibles de Error_SF son:
ERR_INACTIVO
|
No
hay ningún SBF montado
|
int LeeBloqueFisico ( DWORD nbloque, void* bufer );
int EscribeBloqueFisico ( DWORD nbloque, void* bufer );
Estas dos funciones se encargan, respectivamente, de leer y de escribir bloques físicos pertenecientes al SBF montado actualmente. El número de bloque físico para transferir viene dado por nbloque. La transferencia se efectúa sobre la zona de memoria apuntada por bufer. El llamador es responsable de que bufer apunte a una zona con espacio suficiente para un bloque físico.
Ambas funciones devuelven un -1 si se ha producido un error. Los valores posibles de Error_SF son:
ERR_INACTIVO
|
No
hay ningún SBF montado
|
ERR_RANGO
|
Bloque
físico fuera de rango
|
Los archivos del Sistema de Bloques Físicos son los siguientes:
/prac/include/sbfisico.h
|
Interfaz
del SBF
|
/prac/include/superblq.h
|
Estructura
del superbloque
|
/prac/src/sbfisico.c
|
Implementación
del SBF
|
La implementación de muestra en sbfisico.c es el punto de partida para la práctica del sistema de caché. Los desarrolladores de los trabajos de Sistema de Ficheros Básico y Simbólico harían bien en echar un vistazo al código de este fichero.