Wednesday, December 30, 2009

Virtual Memory

Por ahora, Heritage/1 no proverá soporte de hardware para Virtual Memory. Pienso que no será difícil implementarlo en un segundo paso (después que la máquina se encuentre "en explotación") y hacerlo de manera que encaje dentro de la arquitectura, sin violentarla.

¿Por qué Virtual Memory? —Porque, contrario a lo que imaginé en un inicio, Virtual Memory no es un "lujo"; por el contrario: su carencia constituye una limitación bastante seria cuando se piensa en un sistema operativo propiamente dicho. Pasará algún tiempo antes de verme enredado en estas cuestiones pero el momento llegará, y estaré yo tratando de portar un "UNIX-like" OS como Minux ó netBSD, tarea esta que no creo viable (o siquiera posible) en una máquina sin soporte para Virtual Memory.

Cuando me asomé a estos tópicos por primera vez (hace solo seis meses) tuve la impresión de que el papel de Virtual Memory está más en la protección de procesos y el establecimiento de un modelo lineal de memoria para las aplicaciones con las cuales el OS se compromete con más memoria (virtual) de la disponible fisicamente (gracias al "swapping"). Tal vez por eso no me pareció especialmente atractivo dentro de un diseño que se jacta de simple. Ahora, sin embargo, estoy viendo los beneficios de Virtual Memory en otro sentido, y tiene que ver con la carga de programas en memoria.

El OS (o más bien un componente suyo llamado "loader") es responsable de cargar cada programa de storage a memoria y cuando lo hace, necesita "relocalizarlo", esto es, cambiar (al vuelo) las instrucciones de control de flujo (como JP y CALL) en concordancia con la dirección base asignada al programa en cuestión.

En realidad he planeado evitar la necesidad de "relocalización" mediante el uso de instrucciones de direccionamiento relativo (lo cual me sigue pareciendo una buena idea); pero aún usando instrucciones de direccionamiento directo, un loader puediera recalcular todos los saltos sin demasiada dificultad (según me parece) aunque consumiendo algún tiempo en ello, por supuesto.

La solución elegante, no obstante, sería realizar la carga del programa en el dominio de la memoria lineal, proveido por Virtual Memory, para lo cual el hardware deber proveer el debido soporte. En tal caso, cada programa contaría con su propio espacio virtual de direcciones de memoria el cual comprende todo el espacio direccionable (64K); el hardware se encargaría de mapear las direcciones de cada aplicación al espacio real de memoria fisica instalada; el OS se encargaría de mantener dicho mapeo y, por añadidura, implementar reglas de protección de procesos. Y el "loader" se limitaría a mapear el nuevo programa dentro del sistema de Memoria Virtual.

Mas, como dije al principio, el tal soporte será implementado en un segundo paso, una vez que Heritage/1 se encuentre "en explotación".

0 comments:

Post a Comment