<< >> Título

Sistema de Bloques Físicos


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 superbloque

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.

Funciones del nivel físico

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 );

Interfaz de programación

A continuación se detallan las especificaciones de las funciones del Sistema de Bloques Físicos.

Instalación y montaje de discos

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

Acceso al superbloque

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

Lectura y escritura de bloques físicos

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

Fuentes en C

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.


<< >> Título