Veamos otros aspectos de los cuales el sistema operativo es responsable.
Formateo de disco: un nuevo disco magnético es una pizarra blanca. Antes de que un disco pueda almacenar datos, se debe dividir en sectores que el controlador del disco pueda leer o escribir. Esto es llamado formateo a bajo nivel, o formateo físico. Este tipo de formateo llena el disco con una estructura de datos especial para cada sector. La estructura de datos para un sector típicamente consiste de una cabecera, un área de datos (usualmente de un tamaño de 512 bytes), y un trailer. La cabeza y el trailer contienen información usada por el controlador del disco, tal como el número de sector y código corrector de errores (ECC). Cuando el controlador escribe un sector de datos durante una I/O normal, el ECC es
Cola: 98, 183, 37, 122, 14, 124, 65, 67. Cabeza empieza en el cilindro 53.
0 14 37 53 65 67 98 122 124 183 199
Figura 13.4 Scheduling de disco C-SCAN.
Cola: 98, 183, 37, 122, 14, 124, 65, 67. Cabeza empieza en el cilindro 53.
0 14 37 53 65 67 98 122 124 183 199
Cola: 98, 183, 37, 122, 14, 124, 65, 67. Cabeza empieza en el cilindro 53.
0 14 37 53 65 67 98 122 124 183 199
(a)
Figura 13.5 Scheduling de disco (a) LOOK (b) C-LOOK. (b)
modificado con un valor calculado con todos los bytes del área de datos. Cuando se lee el sector, el ECC es recalculado y se compara con el valor almacenado. Si el valor almacenado y el calculado son diferentes, la desigualdad indica que el área de datos del sector esta adulterada y el sector del disco puede estar malo. El ECC es un código corrector de errores ya que contiene bastante información que si solo 1 o 2 bits han sido adulterados, el controlador puede identificar cuales bits han cambiado, y puede calcular cual es su valor correcto. El procedimiento del ECC es realizado automáticamente por el controlador cuando se lee o escribe un sector.
La mayoría de los discos duros son formateados en bajo nivel en la fabrica como parte del proceso de fabricado. Esta información permite al fabricante testear el disco.
Para usar un disco para mantener archivos, el sistema operativo necesita aun registrar su propia estructura de datos en el disco. Esto lo hace en dos pasos. El primer paso es particionar el disco en uno o más grupos de cilindros. El sistema operativo puede tratar a cada partición como un disco separado. Por ejemplo, una partición puede contener una copia del código ejecutable del sistema operativo, mientras otra mantiene los procesos del usuario. Luego de la partición, el segundo paso es llamado formateo lógico, o “hacer el sistema de archivos”. En este paso, el sistema operativo almacena la estructura de datos del sistema de archivos inicial en el disco.
Algunos sistemas operativos dan a programas especiales la habilidad de usar una partición del disco como un gran arreglo secuencial de bloques lógicos, sin ninguna estructura de datos del sistema de archivos. Este arreglo es a veces llamado raw I/O. Por ejemplo, algunos sistemas de base de datos prefieren raw I/O ya que esto les permite el control de la ubicación exacta del disco donde cada registro de la base de datos esta almacenado. Raw I/O desvía a todos los servicios del sistema de archivos, tal como buffer cache, prefetching, asignación de espacio, nombre de archivos, y directorios. Podemos hacer algunas aplicaciones más eficientes implementando sus propios servicios de almacenamiento de propósito general sobre una partición raw, pero la mayoría de las aplicaciones se comportan mejor cuando utilizan los servicios regulares del sistema de archivos.
Bloque de booteo: para que una computadora empiece a correr (por ejemplo, cuando es prendida o reiniciada), necesita tener un programa inicial para correr (bootstrap). Este programa tiende a ser simple: inicializa todos los aspectos del sistema, desde los registros de la CPU a los controladores de los dispositivos y los contenidos de la memoria principal, y luego arranca el sistema operativo. Para hacer este trabajo, éste encuentra el kernel (núcleo) del sistema operativo en disco, carga este kernel en memoria, y salta a la dirección inicial para comenzar la ejecución del sistema operativo.
En la mayoría de las computadoras, el bootstrap es almacenado en memoria de solo lectura (ROM). Esta ubicación es conveniente, ya que la ROM no necesita ser inicializada y esta en un lugar fijo que el procesador puede comenzar a ejecutar cuando se da energía o se resetea. Y, ya que la ROM es de solo lectura, no puede ser infectada por ningún virus. El problema es que cambiar el código de este bootstrap requiere cambiar los chips de hardware de la ROM. Por esta razón, la mayoría de los sistemas almacenan un diminuto programa bootstrap loader en la ROM de booteo, cuyo único trabajo es traer un programa completo de bootstrap de disco. El programa completo de bootstrap puede ser cambiado fácilmente: una nueva versión simplemente se escribe en disco. El programa completo bootstrap es almacenado en una partición llamada los bloques boot, en un lugar fijo del disco. Un disco que tiene una partición boot es llamado un disco boot o disco del sistema.
El código en la ROM boot instruye al controlador de disco para leer los bloques boot en memoria (los drivers de los dispositivos no están cargados en este punto), y luego comienza la ejecución del código. El programa completo bootstrap es más sofisticado que el cargador bootstrap en la ROM boot, y es capaz de cargar el sistema operativo entero, desde una ubicación no fija de disco, y comenzar a correr el sistema operativo. Aun así, el código completo de bootstrap puede ser muy chico. Por ejemplo, el sistema operativo MS-DOS usa un bloque de 512 bytes para su programa boot (figura 13.6).
Bloques malos: Ya que el disco tiene partes que se mueven y pequeñas tolerancias (recordamos que la cabeza del disco se mueve a través de la superficie del disco), ellos están propensos a fallas. Algunas veces la falla es completa, y el disco se debe reemplazar, y su contenido restaurados desde una copia de seguridad. Es muy frecuente que uno o dos sectores se rompan. Algunos discos pueden venir desde fabrica con bloques malos. Dependiendo del disco y controlador en uso, éstos bloques se manejan de una forma muy variada.
En un disco simple, tal como un disco con controladores IDE, los bloques malos son manejados manualmente. Por ejemplo, el comando format en MS-DOS hace un formateo lógico y, parte de este proceso, examina el disco para encontrar bloques malos. Si format encuentra un bloque malo, escribe un valor especial en la correspondiente entrada de la FAT para avisar a las rutinas que ese bloque no debe ser usado. Si los bloques se rompen durante una operación normal, un programa especial (tal como chkdsk) se debe correr manualmente para buscar los bloques rotos y para bloquearlos. Los datos que residen en los bloques rotos normalmente se pierden.
Los discos más sofisticados, tal como los discos SCSI usados en PCs, son inteligentes sobre la recuperación de bloques malos. El controlador mantiene una lista de bloques malos en el disco. La lista es inicializada durante el formateo en bajo nivel en la fabrica, y es modificada según aparezcan nuevos bloques. El formateo en bajo nivel también setea los sectores sobrantes no visibles para el sistema operativo. El controlador puede ser avisado de cambiar un bloque que esta averiado por uno sobrante. Este esquema es conocido como forwarding:
El sistema operativo trata de leer el bloque lógico 87.
El controlador calcula el ECC y encuentra que el sector es malo. Este reporta esto al sistema operativo.
La siguiente vez que el sistema es reiniciado, se correrá un comando especial para decirle al controlador SCSI que reemplace el bloque averiado por uno sobrante.
Luego de esto, cuando el sistema haga un pedido al bloque 87, el pedido será trasladado en la dirección del bloque reemplazado por el viejo por el controlador.