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 />
Otros campos interesantes <strong>de</strong> mm_struct son: (1) rss: marcos <strong>de</strong> página asignados al proceso. (2) total_vm:<br />
tamaño <strong>de</strong>l espacio <strong>de</strong> direcciones <strong>de</strong>l proceso en páginas. (3) locked_vm: Número <strong>de</strong> páginas bloqueadas.<br />
(4) mm_count: número <strong>de</strong> procesos que comparten el mismo <strong>de</strong>scriptor. (5) mmap, mmap_avl, mmap_cache:<br />
punteros a regiones <strong>de</strong> memoria. Los <strong>de</strong>scriptores se almacenan en un caché <strong>de</strong>l Slab allocator.<br />
<strong>3.</strong>4.<strong>3.</strong>8. Regiones <strong>de</strong> Memoria<br />
Linux organiza los intervalos <strong>de</strong> memoria utilizados por un proceso en lo que se <strong>de</strong>nominan regiones <strong>de</strong><br />
memoria. Estas regiones están caracterizadas por una dirección lógica inicial, una longitud y unos ciertos<br />
permisos <strong>de</strong> acceso. Linux implementa una región <strong>de</strong> memoria por medio <strong>de</strong> un objeto <strong>de</strong>l tipo<br />
vm_area_struct (<strong>de</strong>scriptor <strong>de</strong>l área <strong>de</strong> memoria virtual). Cada <strong>de</strong>scriptor i<strong>de</strong>ntifica un rango o intervalo <strong>de</strong><br />
direcciones lineales.<br />
struct vm_area_struct {<br />
struct mm_struct *vm_mm;<br />
unsigned long vm_start, vm_end;<br />
pgprot_t vm_page_prot;<br />
unsigned short vm_flags;<br />
short vm_avl_height;<br />
struct vm_area_struct *vm_next;<br />
struct vm_area_struct *vm_avl_left, *vm_avl_right;<br />
struct vm_area_struct *vm_next_share;<br />
struct vm_uea_struct **vm_pprev_share;<br />
struct vm_cperations_struct *vm_ops;<br />
unsigned long vm_offset;<br />
struct file *vm_file;<br />
unsigned long vm_pte;<br />
};<br />
Algunos campos interesantes <strong>de</strong> esta estructura <strong>de</strong> datos son los siguientes: (1) vm_start: primera dirección<br />
válida <strong>de</strong>l intervalo. (2) vm_end: última dirección válida más 1 (primera dirección fuera <strong>de</strong>l intervalo, vm_end<br />
– vm_start <strong>de</strong>nota la longitud <strong>de</strong> la región <strong>de</strong> memoria). (3) vm_mm: <strong>de</strong>scriptor <strong>de</strong> memoria dueño <strong>de</strong> la<br />
región (apunta al <strong>de</strong>scriptor <strong>de</strong> memoria virtual vm_struct <strong>de</strong>l proceso que es dueño <strong>de</strong> la región). (4)<br />
vm_flags: <strong>de</strong>rechos <strong>de</strong> acceso. (5) vm_next, vm_avl_left, vm_avl_right: punteros a otras regiones <strong>de</strong>l espacio<br />
<strong>de</strong> direcciones.<br />
Las regiones nunca se solapan, y el kernel intenta fusionarlas siempre que los <strong>de</strong>rechos <strong>de</strong> acceso coincidan:<br />
(1) El kernel pue<strong>de</strong> crear una región nueva o agrandar una existente. (2) Igualmente, al eliminar una región el<br />
kernel redimensiona las regiones afectadas, incluso dividiéndolas en dos.<br />
Organización <strong>de</strong> las regiones <strong>de</strong> memoria. Primera aproximación: lista enlazada mediante vm_next. Una<br />
operación que se realiza muy frecuentemente es la búsqueda <strong>de</strong> la región correspondiente a una dirección<br />
lineal ⇒ Mejora: or<strong>de</strong>nar ascen<strong>de</strong>ntemente la lista por direcciones lineales. Se consi<strong>de</strong>ra encontrada la región<br />
cuando por primera vez vm_end es mayor a la dirección. Como es muy probable que las siguientes búsquedas<br />
que se realicen tengan como resultado la misma región, se mantiene un puntero a la última región encontrada<br />
en el <strong>de</strong>scriptor <strong>de</strong> memoria, mmap_cache.<br />
Las regiones se utilizan para representar intervalos contiguos <strong>de</strong> direcciones lógicas con los mismos permisos<br />
o el mismo comportamiento. Todas las acciones que se <strong>de</strong>ben tomar en relación a una región vienen dadas<br />
por las operaciones establecidas en el campo vm_ops (struct vm_operations_struct). Esta estructura contiene<br />
tres campos bastante importantes: la función open, la función close y la función nopage. En particular, la<br />
función nopage indica que acción realizar cuando una dirección lógica perteneciente a esa región no tiene una<br />
página física asociada o da un fallo <strong>de</strong> protección.<br />
Departamento <strong>de</strong> Lenguajes y Computación. <strong>Universidad</strong> <strong>de</strong> Almería Página <strong>3.</strong>38