TEMA 3. GESTIÃN DE MEMORIA - Universidad de AlmerÃa
TEMA 3. GESTIÃN DE MEMORIA - Universidad de AlmerÃa
TEMA 3. GESTIÃN DE MEMORIA - Universidad de AlmerÃa
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Diseño <strong>de</strong> Sistemas Operativos<br />
Tema <strong>3.</strong> Gestión <strong>de</strong> Memoria<br />
Dirección lineal<br />
Dir Global Dir Intermedio Tabla Desplazamiento<br />
Página<br />
Tabla <strong>de</strong> Páginas<br />
Directorio Global <strong>de</strong><br />
Tablas <strong>de</strong> Páginas<br />
+<br />
Directorio Intermedio<br />
<strong>de</strong> Tablas <strong>de</strong> Páginas<br />
+<br />
+<br />
CR3<br />
+<br />
Figura <strong>3.</strong>11. Mo<strong>de</strong>lo <strong>de</strong> Paginación <strong>de</strong> Linux.<br />
Linux gestiona la memoria central y las tablas <strong>de</strong> páginas utilizadas para convertir las direcciones lineales<br />
(virtuales) en direcciones físicas. Implementa una gestión <strong>de</strong> la memoria que es ampliamente in<strong>de</strong>pendiente<br />
<strong>de</strong>l procesador sobre el que se ejecuta. En realidad, la gestión <strong>de</strong> la memoria implementada por Linux<br />
consi<strong>de</strong>ra que dispone <strong>de</strong> una tabla <strong>de</strong> páginas a tres niveles: (1) directorio global <strong>de</strong> tablas <strong>de</strong> páginas (page<br />
global dirertory) cuyas entradas contienen las direcciones <strong>de</strong> páginas que contienen tablas intermedias; (2)<br />
directorio intermedio <strong>de</strong> tablas <strong>de</strong> páginas (page middle directory) cuyas entradas contienen las direcciones<br />
<strong>de</strong> páginas que contienen tablas <strong>de</strong> páginas; (3) las tablas <strong>de</strong> páginas (page table) cuyas entradas contienen<br />
las direcciones <strong>de</strong> páginas <strong>de</strong> memoria que contienen el código o los datos utilizados por el kernel o los<br />
procesos <strong>de</strong> usuario. Evi<strong>de</strong>ntemente, este mo<strong>de</strong>lo no siempre correspon<strong>de</strong> al procesador sobre el cual Linux<br />
se ejecuta (los procesadores i386, por ejemplo, utilizan una tabla <strong>de</strong> páginas que sólo posee dos niveles). El<br />
kernel efectúa una correspon<strong>de</strong>ncia entre el mo<strong>de</strong>lo implementado por el procesador y el mo<strong>de</strong>lo <strong>de</strong> Linux.<br />
En los procesadores i386, por ejemplo, el kernel consi<strong>de</strong>ra que el directorio intermedio <strong>de</strong> tablas <strong>de</strong> páginas<br />
sólo contiene una entrada.<br />
La MMU <strong>de</strong> reinicializa con un nuevo directorio <strong>de</strong> tablas <strong>de</strong> páginas para cada proceso. Así se consiguen<br />
aislar espacios <strong>de</strong> direcciones. Se emplean los bits User/Supervisor y Read/Write para la protección. Se<br />
emplean los anteriores bits junto con los bits Dirty y Accessed para manejar las diferentes posibilida<strong>de</strong>s <strong>de</strong><br />
falta <strong>de</strong> página. Linux <strong>de</strong>pen<strong>de</strong> fuertemente <strong>de</strong> la paginación para la gestión <strong>de</strong> procesos. De hecho, la<br />
traducción automática <strong>de</strong> dirección lineal a dirección física hace posible los siguientes objetivos: (1) Asignar<br />
un espacio <strong>de</strong> direcciones físicas diferentes a cada proceso, asegurando una protección eficiente ante errores<br />
<strong>de</strong> direccionamiento. (2) Distinguir páginas (grupos <strong>de</strong> datos) <strong>de</strong> marcos <strong>de</strong> páginas (direcciones físicas en<br />
memoria principal). Esto permite a la misma página que se almacene en un marco <strong>de</strong> página, entonces<br />
guardar en disco y <strong>de</strong>spués recargarla en un marco <strong>de</strong> página diferente. Esto es muy importante para el<br />
mecanismo <strong>de</strong> memoria virtual.<br />
En Linux el espacio <strong>de</strong> direcciones lineales se divi<strong>de</strong> en dos partes: (1) Direcciones lineales <strong>de</strong>s<strong>de</strong> 0x0000000<br />
a PAGE_OFFSET – l, accesibles en cualquier modo (usuario o kernel). (2) Direcciones lineales <strong>de</strong>s<strong>de</strong><br />
PAGE_OFFSET hasta 0xffffffff, sólo en modo kernel. Generalmente PAGE_OFFSET se inicializa a<br />
0xc0000000 (3Gb). Las primeras 768 entradas <strong>de</strong>l directorio <strong>de</strong> tablas <strong>de</strong> páginas (que mapean los primeros<br />
3Gb) <strong>de</strong>pen<strong>de</strong>n <strong>de</strong> cada proceso. El resto <strong>de</strong> entradas son las mismas para todos los procesos. El mapeado<br />
final proyecta las direcciones lineales empezando en PAGE_OFFSET en direcciones físicas empezando en 0.<br />
Toda la memoria física <strong>de</strong>be ser accesible por el kernel. Éste mantiene un conjunto <strong>de</strong> tablas <strong>de</strong> páginas para<br />
su propio uso, cuya raíz es el master kernel Page Global Directory. Después <strong>de</strong> la inicialización <strong>de</strong>l sistema<br />
este conjunto <strong>de</strong> tablas <strong>de</strong> páginas no son utilizadas nunca por ningún proceso o thread <strong>de</strong>l kernel.<br />
Departamento <strong>de</strong> Lenguajes y Computación. <strong>Universidad</strong> <strong>de</strong> Almería Página <strong>3.</strong>26