Sistemas operativos modernos
loj que incrementa sus contenidos se alimentan de una batena pequeña para que la hora se si ga actualizando en forma correcta aunque la computadora esté apagada. La memoria CMOS también puede guardar los parámetros de configuración, que incluyen el disco desde el cual se debe arrancar. Se usa CMOS porque consume tan poca electricidad que la batería original ins talada desde la fábrica puede durar varios años. Sin embargo, cuando la batería comienza a fa llar, puede parecer que la computadora ha contraído el mal de Alzheimer, olvidando cosas que ha conocido desde hace años, como el disco desde el cual debe arrancar. Por el momento concentrémonos en la memoria principal. A menudo es conveniente man tener varios programas en la memoria al mismo tiempo. Si un programa se bloquea mientras espera que termine una lectura de disco, otro programa podrá usar la CPU para aprovecharla mejor. Sin embargo, cuando hay dos o más programas a la vez en la memoria, deben resolver se dos problemas: 1. Cómo proteger los programas entre sí, y cómo proteger al kernel de todos ellos. 2. Cómo manejar la relocalización. Puede haber muchas soluciones, pero todas implican equipar la CPU con hardware especial. El primer problema es obvio, pero el segundo es un poco más sutil. Cuando se compila y enlaza un programa, el compilador y el enlazador no saben en qué parte de la memoria física se cargará cuando se ejecute. Por ello, generalmente suponen que comenzará en la dirección O y colocan allí la primera instrucción. Supongamos que la primera instrucción toma de la me moria la palabra que está en la dirección 10,000. Y supongamos también que todo el progra ma y los datos se cargan a partir de la dirección 50,000. Cuando se ejecute la primera instrucción, fallará porque hará referencia a la palabra que está en la 10,000 en vez de a la que está en la 60,000. Para resolver este problema, hay que reubicar el programa en el momento de la carga, encontrando todas las direcciones y modificándolas (lo cual es facrible, pero cos toso), o bien efectuar la reubicación sobre la marcha, en el momento de la ejecución. La solución más sencilla se muestra en la figura l-9a. En esta figura vemos una computado ra equipada con dos registros especiales, el registro base y el registro límite. (Cabe señalar que, en este libro, los números que comienzan con Ox están en hexadecimal, convención empleada en el lenguaje C. Asimismo, los números que comienzan con un cero a la izquierda están en octal.) Cuando se ejecuta un programa, el registro base se ajusta de modo que apunte al principio del texto de su programa, mientras que el registro límite indica cuánto espacio ocupan en total el tex to de! programa y sus datos. Cuando hay que tomar una instrucción, el hardware verifica si el contador de programa tiene un valor menor que el registro límite y, de ser así, suma el valor del contador de programa al del registro base y envía la suma a la memoria. De forma similar, cuando el programa quiere tomar una palabra de datos (digamos, de la dirección 10,000), el hard ware suma de manera automática el contenido del registro base (digamos, 50,000) a esa direc ción y envía la suma (60,000) a la memoria. El registro base impide que un programa haga referencia a alguna parte de la memoria por debajo de la porción donde está almacenado, y el re gistro límite impide tener acceso a la memoria que está más arriba. Así, este esquema resuelve
RkJQdWJsaXNoZXIy MjI4NDcx