Sistema Paginado Santiago Elizondo Mujica Pedro Henríquez Castellano

Slides:



Advertisements
Presentaciones similares
GESTION DE MEMORIA.
Advertisements

III - Gestión de memoria
Administración de memoria
SISTEMAS OPERATIVOS GESTION DE MEMORIA INTEGRANTES Lizeth Chandi
Sistema operativo Componentes de un sistema operativo
III - Gestión de memoria
EQUIPO ·# 3 SISTEMAS OPERATIVOS
Programación, Algoritmos y Estructuras de Datos
Introducción a los Sistemas Operativos Memoria Virtual
Departamento de Ingeniería de Sistemas Universidad de Antioquia
Informática II Prof. Dr. Gustavo Patiño MJ
Tema II Unidad de memoria. 2 Unidad de memoria 2.1 Definiciones y conceptos básicos Localización Capacidad Unidad de transferencia
Windows XP sp3.
Teoría de lenguajes y compiladores
Programación en Lenguaje Ensamblador.
Johanna Lizeth Rodríguez Lorena Fda. Chávarro Ramos
1 E/S Driver Impresora –Airam Godoy Hernández –Jose Yeray Suárez Perdomo.
1 Diseño de Sistemas Operativos Sistema de Paginado Nayarit Santana Pacheco Iván Martín Mesa Ingeniería en Informática Facultad de Las Palmas de Gran Canaria.
MINIX FILE SYSTEM Cátedra: Diseño e Implementación de Sistemas Operativos UTN-FRSF Tomado de: Sistemas Operativos Diseño e Implementación - A.S.Tanenbaum.
Paginación y Segmentación Giselle M. Agosto Carlos R. Pérez
Almacenamiento y Recuperación de la Información 2do Semestre 2005 Wenceslao Palma M.
Tema 6: Clases Antonio J. Sierra.
Direcciones físicas y direcciones virtuales (lógicas)
Paginación-Segmentación Fundamentos Translación de Direcciones Tabla de páginas Segmentación Emely Arráiz Ene-Mar 08.
HILOS Y COMUNICACIÓN ENTRE PROCESOS
Igor Santos Grueiro. Ahora tenemos datos y datos …
Archivos. fopen(...) Para comenzar a utilizar un archivo primero se debe abrir, invocando a la función fopen(...) FILE * fopen(char* nombre_arch, char*
Signal, kill, sigaction y máscara de señales
Tema 10: Gestión de Memoria
Administración de memoria
PAGINACIÓN Y SEGMENTACIÓN
Archivos.
Clase 10: Estructuras de datos y arreglos.
Administración de Memoria Memoria Virtual
Las personas se enfrentaron por primera vez con programas que eran demasiados grandes para caber en la memoria disponible. La solucion fue dividir el programa.
Sistema de archivos Sistemas operativos.
Tema 10.3: Asignación de Espacio No Contiguo. Tema 10.3: 2 Silberschatz, Galvin and Gagne ©2005 Fundamentos de los Computadores (ITT, Sist. Electr.),
Overview Sistemas Computacionales
Asignación de Espacio No Contiguo
Soporte HW para Administración de Memoria Cecilia Hernández
Estructura del sistema de Archivos de
Administración de Memoria
Material de apoyo Unidad 4 Estructura de datos
Arquitectura NFS El servidor NFS exporta uno o más directorios
Introducción a los Sistemas Operativos
Capítulo 7 Gestión de memoria.
Gestión de procesos Sistemas Operativos Edwin Morales
ARQUITECTURA DE COMPUTADORES Semestre A-2009 Clase 21 La mayor parte del contenido de estas láminas, ha sido extraído del libro Computer Organization and.
1 Descripción y control de procesos Capítulo 3. 2 Requerimientos de un SO relacionados con procesos Ejecutar concurrentemente múltiples procesos para.
COMPONENTES DEL SISTEMA OPERATIVO.
Memoria virtual.
Gestión de Memoria.
Teoría de Sistemas Operativos Administración de Archivos.
Breve introducción a la arquitectura de 32 bits intel.
CONCEPTOS FUNDAMENTALES DEL NIVEL DEL SISTEMA OPERATIVO
Breve introducción a la arquitectura de 32 bits intel.
Punteros Recomendado: 1. Nivelación Funciones
Estructura de los Sistemas Operativos
Gestión de Memoria.
Sistemas de Archivos Sistemas Operativos.  Se debe proporcionar un almacenamiento secundario que respalda a la memoria principal  El Sistema de archivos.
Teoría de Sistemas Operativos Memoria Departamento de Electrónica 2º Semestre, 2003 Gabriel Astudillo Muñoz
MIA - Grupo 5 Unidad 2.

MEMORIA DINÁMICA.
Por: Viridiana Fernández Carreón
Silberschatz, Galvin, and Gagne  Applied Operating System Concepts Memoria Virtual Concepto Paginado bajo demanda Performance del Paginado bajo.
Gestión de Memoria – Parte 2
Métodos en Java. Estructura de un programa en Java ► La relación con la vida misma la podemos ver en el siguiente comentario: Imaginemos que dos clases.
Administración de Memoria Conceptos Swapping Asignación Continua Paginación Segmentación Segmentación con Paginación.
1/50 Ing. Gerardo Chávez Malpartida Administración de Memoria SISTEMAS OPERATIVOS.
Transcripción de la presentación:

Sistema Paginado Santiago Elizondo Mujica Pedro Henríquez Castellano Ingeniería en Informática Diseño de Sistemas Operativos Curso 2005 - 2006 Santiago Elizondo Mujica Pedro Henríquez Castellano

I N D I C E T E M A T I C O Introducción Diagrama General Estructuras de Datos Tabla de Páginas Directorio de Páginas Cachés Gestión Asignación y Liberación de páginas Asignación y Liberación de zonas de memoria (núcleo) Bloqueo de páginas en memoria Tratamiento de Excepciones Novedades de la Version 2.6

INTRODUCCIÓN Todo proceso tiene asociado un espacio de direccionamiento donde se encuentran las zonas de memoria que le han sido asignadas. Este espacio se compone de varias regiones de memoria: código datos inicializados no inicializados código y datos de las bibliotecas compartidas pila Memoria del núcleo Entorno Argumentos Pila Datos (bss) Datos (data) Código 0xC0000000 _end _data _etext Espacio de direccionamiento de un proceso

INTRODUCCIÓN Al arrancar un proceso, no siempre es necesaria toda la información del mismo PAGINACIÓN BAJO DEMANDA El espacio de cada región de memoria se organiza en páginas para un mejor manejo de la información. Cada pagina es de tamaño fijo. Memoria del núcleo Entorno Argumentos Pila Datos (bss) Datos (data) Código 0xC0000000 _end _data _etext Espacio de direccionamiento de un proceso

DIAGRAMA GENERAL Memoria física DATA 0x8059BB8 CODE 0x8048000 mm task_struct DATA CODE Memoria física count pgd mmap mmap_avl mmap_sem mm_struct vm_next vm_area_struct vm_end vm_start vm_flags vm_inode vm_ops 0x8059BB8 vm_next vm_area_struct vm_end vm_start vm_flags vm_inode vm_ops 0x8048000 0x0000000

ESTRUCTURAS DE DATOS: TABLAS DE PÁGINAS Los procesos necesitan direcciones contiguas DIRECCIONES VIRTUALES (no tienen porqué ser contiguas en memoria física) Estas direcciones son utilizadas tanto por los procesos como por el núcleo. Para acceder a memoria es necesario convertir la dirección virtual en una dirección física. La dirección virtual se divide en dos partes: número de página desplazamiento Dirección virtual Pagina Desplaz. Tabla de páginas dirección Pagina Desplaz. Dirección física

ESTRUCTURAS DE DATOS: TABLAS DE PÁGINAS El número de página se utiliza como índice de una tabla de páginas y el desplazamiento hace referencia a la posición que ocupa el dato dentro de la página en cuestión. Todos los accesos a memoria se realizan a través de la tabla de páginas y cada proceso tiene una propia. Para que 2 procesos compartan una página, debe aparecer el nº de marco de la página física en sus respectivas tablas de páginas. marco es a memoria física lo que página a memoria virtual Dirección virtual Pagina Desplaz. Tabla de páginas dirección Pagina Desplaz. Dirección física

Descriptor Página de memoria ESTRUCTURAS DE DATOS: TABLAS DE PÁGINAS La tabla de páginas contiene la siguiente información: Flag de validación nº de marco (memoria física) información de control Cuando el contenido de una página se altera, el núcleo se encarga de actualizar la página correspondiente TABLA DE DESCRIPTORES Descriptor Página de memoria Dirección virtual Pagina Desplaz. Tabla de páginas dirección Pagina Desplaz. Dirección física

ESTRUCTURAS DE DATOS: TABLAS DE PÁGINAS La estructura page (<include/linux/mm.h>) define el formato de cada descriptor. Contiene los siguientes campos: struct page { page_flags_t flags; atomic_t _count; atomic_t _mapcount; unsigned long private; struct address_space *mapping; pgoff_t index; struct list_head lru; #if defined(WANT_PAGE_VIRTUAL) void *virtual; #endif };

ESTRUCTURAS DE DATOS: TABLAS DE PÁGINAS TIPO CAMPO DESCRIPCIÓN page_flags_t flags Estado de la página atomic_t; _count Números de referencia a la página atomic_t _mapcount Contador de las entradas a la tabla de páginas. Limita la busqueda reverse mapping unsigned long private Cuando la pagina esta libre indica el orden en el buddy system. struct address_space *mapping Si bit menos significativo esta a 0 o NULL es un puntero a inode, sino es un puntero a anon_vma (memoria anonima) object. Esta estructura contiene métodos como set_page_dirty pgoff_t index index Dezplazamiento dentro del mapeado. struct list_head lru Lista paginas a salir (algoritmo lru)

ESTRUCTURAS DE DATOS: TABLAS DE PÁGINAS Los valores que puede tomar el campo flags <linux/page-flags.h>) de la estructura anterior se muestran en la siguiente tabla: CONSTANTE (FLAGS) VALOR SIGNIFICADO PG_locked La página está bloqueada en memoria PG_error 1 Se ha producido un error en la carga de la página en memoria PG_referenced 2 La página ha sido accedida PG_uptodate 3 El contenido de la página está actualizado PG_dirty 4 Indica si el contenido de la página se ha modificado PG_lru 5 PG_reserved 11 La página está reservada para un uso futuro, no es posible acceder a ella. PG_private 12 Contiene datos privados (something private) PG_writeback 13 Se indica que la pagina usa el método writeback PG_swapcache 16 Indica si la pagina esta intercambiada PG_nosave_free 18 Pagina libre, pero no debería ser escrita.

ESTRUCTURAS DE DATOS: TABLAS DE PÁGINAS PROBLEMAS Es necesario mantener la tabla de páginas en memoria, sin embargo, dado el espacio de direccionamiento de cada proceso sería imposible. Otro problema que surge con este tipo de tablas tiene que ver con la velocidad. Si la tabla de un proceso es muy grande, acceder a ella ralentizaría la ejecución del mismo. SOLUCIÓN Como solución, Linux descompone la tabla de páginas original en distintos niveles. Este conjunto de tablas se denomina directorio de páginas. CAT PAG DESPLAZAMIENTO addr addr PAG OFFSET

ESTRUCTURAS DE DATOS: DIRECTORIO DE PÁGINAS GLOBAL El directorio de tablas de páginas contiene en cada entrada la dirección base de la tabla de páginas correspondiente. Se utilizan los 10 bits de mayor peso de la dirección lineal (31-22) como índice en el directorio. Cada tabla de páginas contiene en cada entrada la dirección base de una página física o marco. Se utilizan los siguientes 10 bits de la dirección lineal (21-12) como índice en la tabla. Los restantes 12 bits de la dirección lineal se utilizan como desplazamiento dentro del marco de página. CAT PAG DESPLAZAMIENTO addr addr PAG OFFSET

ESTRUCTURAS DE DATOS: DIRECTORIO DE PÁGINAS GLOBAL Linux soporta tipos de arquitecturas basadas en 3 niveles, por lo que introduce una tabla intermedia para darles soporte. Si la arquitectura pertenece a la familia x86, Linux utiliza la tabla intermedia que contiene un único descriptor. Los siguientes tipos están declarados en <asm/page.h> y son los tipos de datos utilizados en las entradas de las tablas de páginas. L1 L2 L3 offset Directorio Intermedio Paginas Memoria fisica typedef struct { unsigned long pte_low, pte_high; } pte_t; typedef struct { unsigned long long pmd; } pmd_t; typedef struct { unsigned long long pgd; } pgd_t;

ESTRUCTURAS DE DATOS: DIRECTORIO DE PÁGINAS GLOBAL Cada proceso (task_struct) tiene un campo mm de tipo mm_struct que almacena la información de su espacio de direcciones. El campo pgd es del tipo pgd_t: typedef struct { unsigned long long pgd; } pgd_t; Mantiene el directorio de páginas utilizado para resolver la dirección física dada una dirección virtual. mm task_struct count pgd mmap mmap_avl mmap_sem mm_struct

ESTRUCTURAS DE DATOS: DIRECTORIO DE PÁGINAS GLOBAL Para localizar una dirección (addr), es necesario saber a que pgd_t pertenece: pgd = mm->pgd[addr >> 22]; y determinar la entrada correspondiente en la tabla de descriptores intermedia: pmd = (pmd_t *) pgd; Una vez sabemos a qué entrada pmd_t corresponde la dirección, se consulta el último nivel del árbol: un arreglo de PTRS_PER_PTE (1024) objetos de tipo pte_t asociado a la estructura pmd_t: pte = pmd[(addr>>PAGE_SHIFT) & (PTRS_PER_PTE - 1)]; mm task_struct count pgd mmap mmap_avl mmap_sem mm_struct

ESTRUCTURAS DE DATOS: CACHÉ DE PÁGINAS La mejor forma de obtener un buen rendimiento consiste en mantener en memoria caches de las páginas que se utilizan muy a menudo. Las páginas pueden corresponder a: - Código ejecutado por los procesos - Contenido de archivos proyectados en memoria Linux emplea unas cuantas caches para la gestión de la memoria: - Buffer Cache - Cache de Páginas - Cache de Intercambio (swap) - Caches Hardware La caché se gestiona dinámicamente. Proceso DATA CODE Memoria pagina Disco

ESTRUCTURAS DE DATOS: CACHÉ DE PÁGINAS Buffer Cache Contiene buffers de datos que son utilizados por los manejadores de dispositivos de bloques. Un dispositivo de bloques es aquel sobre el que sólo se pueden realizar operaciones de lectura o escritura de bloques de tamaño fijo. Si un bloque se puede encontrar en el buffer cache, no es necesario leerlo del dispositivo de bloques físico. Cache de Páginas Se utiliza para acelerar el acceso a imágenes y datos en disco. Guarda el contenido lógico de un fichero de página en página. Conforme las páginas se leen en memoria, se almacenan en la page cache. Proceso DATA CODE Memoria pagina

ESTRUCTURAS DE DATOS: CACHÉ DE PÁGINAS Cache de Intercambio (swap) Solo las páginas que han sido modificadas (dirty) son guardadas en el fichero de intercambio. Evita muchas operaciones de disco innecesarias y costosas producidas en un sistema con mucho trasiego de páginas. Caches Hardware Es una cache normalmente implementada en el propio procesador; la cache de entradas de tabla de página. El procesador no necesita siempre leer la tabla de páginas directamente, sino que guarda en esta cache las traducciones de las páginas conforme las va necesitando. Son los Translation Look-aside Buffers (TLB) que contienen copias de las entradas de la tabla de páginas de uno o más procesos del sistema. Proceso DATA CODE Memoria pagina

ASIGNACIÓN Y LIBERACIÓN DE PÁGINAS Linux utiliza el principio del Buddy system para asignar y liberar eficientemente bloques de páginas. El núcleo mantiene una lista de grupos de páginas disponibles. El tamaño de los grupos es fijo, siendo asignados un número de páginas igual a potencias de 2. 0 Grupos de 1 página 1 Grupos de 2 páginas ... 5 Grupos de 32 páginas Cada grupo hace referencia a páginas contiguas en memoria. pagina pagina pagina

Petición de asignación ASIGNACIÓN Y LIBERACIÓN DE PÁGINAS BUDDY SYSTEM: Petición de asignación busca un grupo disponible dentro de la lista que contiene grupos de páginas de tamaño igual o inmediatamente superior al especificado. El grupo se divide en 2 partes: tantas páginas como tamaño de memoria especificado resto de páginas que continúan disponibles

ASIGNACIÓN Y LIBERACIÓN DE PÁGINAS Las páginas que no son utilizadas se insertan en las otras listas. Dentro de cada lista, se comprobaría si el grupo de páginas adyacentes se encuentra disponible, en ese caso se fusionan los grupos y pasan a la lista de grupos de tamaño inmediatamente superior. Así sucesivamente hasta llegar al tope. Este proceso se repite si en vez de ser páginas que sobran de una asignación, son páginas que han sido liberadas.

ASIGNACIÓN Y LIBERACIÓN DE PÁGINAS zone 5 page 4 page page Nr_free 56 4 3 2 1 page nr_free free_area

ASIGNACIÓN Y LIBERACIÓN DE PÁGINAS struct free_area { struct list_head free_list; unsigned long nr_free; }; La tabla free_area (linux/mmzone.h) contiene la dirección del primer descriptor de grupo de páginas para cada tamaño de grupo: La estructura zone (linux/mmzone.h) contiene un vector de areas libres (free_area. La estructura zonelist (linux/mmzone.h) contiene un vector de estructuras zones: struct zonelist { struct zone *zones[MAX_NUMNODES * MAX_NR_ZONES + 1]; }; La memoria física se divide en multiples zonas: 0- ZONE_DMA < 16 MB ISA DMA capable memory 1- ZONE_NORMAL 16-896 MB direct mapped by the kernel 2- ZONE_HIGHMEM > 896 MB only page cache and user processes 3- MAX_NR_ZONES

ASIGNACIÓN Y LIBERACIÓN DE PÁGINAS struct zone { 112 unsigned long free_pages; 113 unsigned long pages_min, pages_low, pages_high; 122 unsigned long lowmem_reserve[MAX_NR_ZONES]; 126 /* Diferentes tamaños de area libre */ 130 struct free_area free_area[MAX_ORDER]; 133 ZONE_PADDING(_pad1_) 135 /* Fields commonly accessed by the page reclaim scanner */ 136 spinlock_t lru_lock; 137 struct list_head active_list; 138 struct list_head inactive_list; 139 unsigned long nr_scan_active; 140 unsigned long nr_scan_inactive; 141 unsigned long nr_active; 142 unsigned long nr_inactive; 143 unsigned long pages_scanned; 144 int all_unreclaimable; 166 ZONE_PADDING(_pad2_) .... 212 }

ASIGNACIÓN Y LIBERACIÓN DE PÁGINAS #define get_free_page get_zeroed_page fastcall unsigned long __get_free_pages(unsigned int gfp_mask, unsigned int order) { struct page * page; page = alloc_pages(gfp_mask, order); if (!page) return 0; return (unsigned long) page_address(page); } fastcall unsigned long get_zeroed_page(unsigned int gfp_mask) { struct page * page; BUG_ON(gfp_mask & __GFP_HIGHMEM); page = alloc_pages(gfp_mask | __GFP_ZERO, 0); if (page) return (unsigned long) page_address(page); return 0; }

ASIGNACIÓN Y LIBERACIÓN DE PÁGINAS Se distinguen dos tipos de paginas: Hot: La pagina esta en la cache del procesador. Cold: La pagina esta en la memoria principal.   void free_hot_page(struct page *page); void free_cold_page(struct page *page);

ASIGNACIÓN Y LIBERACIÓN DE PÁGINAS 900 fastcall void __free_pages(struct page *page, unsigned int order) { 902 if (!PageReserved(page) && put_page_testzero(page)) { 903 if (order == 0) 904 free_hot_page(page); 905 else 906 __free_pages_ok(page, order); 907 } 908 } 912 fastcall void free_pages(unsigned long addr, unsigned int order) 913 { 914 if (addr != 0) { 915 BUG_ON(!virt_addr_valid((void *)addr)); 916 __free_pages(virt_to_page((void *)addr), order); 917 } 918 }

ASIGNACIÓN Y LIBERACIÓN DE PÁGINAS (NÚCLEO) Linux ofrece 2 tipos de funciones para asignar zonas de memoria del espacio de direccionamiento propio del núcleo: kmalloc y kfree: páginas contiguas en memoria central - Útiles para la gestión de zonas pequeñas. - Es más apropiada para el manejo de memoria utilizada por dispositivos o tareas en tiempo real. - Ineficaces con zonas de grandes tamaños - Bloques de tamaño fijo vmalloc y vfree: páginas no contiguas en memoria central - El tamaño de la memoria “desperdiciada” es menos importante.

.... ... ... ASIGNACIÓN Y LIBERACIÓN DE PÁGINAS (NÚCLEO) En la implementación de kmalloc y kfree, Linux utiliza listas de zonas disponibles. Existe una para cada tamaño de zona. Aunque kmalloc pida un tamaño específico, Linux busca dentro de la lista de tamaño inmediatamente superior. El número de páginas varía según el tamaño de los bloques almacenados en la lista. Como mínimo se establece tantas como sean necesarias para formar un bloque. .... firstfree bh_next firstfree ... firstfree next ... Listas de bloques de memoria disponibles

BLOQUEO DE PÁGINAS EN MEMORIA Linux, al arrancar un proceso, evita cargar todas las páginas que forman parte del espacio de direccionamiento de éste utilizando la paginación bajo demanda. De la misma forma, cuando el núcleo necesita memoria central puede decidir liberar aquellas páginas que no han sido utilizadas en un periodo de tiempo, escribiéndolas en memoria secundaria (en caso de haber sido modificadas). Para evitar que un proceso se vea suspendido por el núcleo mientras espera por la carga de sus páginas, Linux permite a los procesos privilegiados bloquear ciertas páginas en memoria. Existen diversas llamadas al sistema que permiten a un proceso especificar que sus páginas no deben ser descartadas de la memoria. Proceso DATA CODE Memoria pagina Disco

DISPOSITIVOS DE SWAP Cuando el núcleo necesita memoria resuelve el problema eliminando páginas. Si estas páginas han sido modificadas, será necesario guardarlas en disco: Archivo proyectado en memoria se rescribe en el archivo. Datos se guarda en un dispositivo swap. Linux puede llegar a utilizar varios dispositivos swap; por este motivo, cuando se ha de guardar una página, se exploran los dispositivos de swap activos hasta encontrar un lugar donde escribirla. Funciones utilizadas: Inicialización de dispositivo mkswap Activación de dispositivo swapon Desactivación de dispositivo swapoff Descartar páginas de la memoria kswapd

COPY ON WRITE Copy-on-write es una técnica para realizar eficientemente la copia de páginas. Cuando se invoca a la primitiva fork, Linux no duplica las páginas de memoria que son necesarias para el nuevo proceso, sino que hace apuntar las entradas de la tabla de páginas del nuevo proceso a las páginas del proceso padre. Cuando alguna de las páginas es modificada por alguno de los procesos, entonces el núcleo pasa a realizar la duplicación de dicha página. Así, Linux se evita la copia de páginas de memoria que no van a ser utilizadas (p.e. el código situado antes de la primitiva fork, en muy probable que no sea utilizado por el proceso hijo), ahorrando la memoria correspondiente y el tiempo necesario para copiarlas.   La forma de llevar a cabo este proceso consiste en establecer los permisos de estas páginas a sólo-lectura pero sabiendo que dichas páginas se pueden modificar (indicándolo en el vma correspondiente). Cuando ocurre una violación de acceso a estas páginas (uno de los procesos intenta escribir) es cuando se realiza la duplicación propiamente dicha.

COPY ON WRITE

TRATAMIENTO DE EXCEPCIONES Es el procesador (a través del MMU) quien provoca las excepciones en ciertos accesos a memoria: Acceso incompatible con la protección asociada a una página en memoria. Acceso a una pagina no presente en memoria. Las funciones usadas en el tratamiento de una excepción se definen en mm/memory.c: do_wp_page do_swap_page do_no_page handle_pte_fault handle_mm_fault do_page_fault Valores devuelto: #define VM_FAULT_OOM -1 #define VM_FAULT_SIGBUS 0 #define VM_FAULT_MINOR 1 #define VM_FAULT_MAJOR 2

TRATAMIENTO DE EXCEPCIONES CPU genera una excepción con un fallo de página TSS LDT EAX Descriptor 1 EBX Descriptor 2 ECX Descriptor 3 MEMORIA NÚCLEO ... Base IDT GDT CS Descriptor n S D A B L A + TR FLG Descriptor 1 S D A B L A Page_fault { pushl $do_page_fault jmp error_code } 2 S D A LDTR B L A Desplazamiento 33 S D A B L A S D A B L A i S D A B L A S D A B L A 255 S D A B L A B L B L IDTR GDTR Limite S – Selector D – Desplazamiento A – Atributos B – Base L - Limite

TRATAMIENTO DE EXCEPCIONES Esta función se encarga de manejar los fallos de pagina do_page_fault, se encuentra en el archivo /arch/i386/mm/fault.c La funcionalidad en resumen es: 1- Determinar la dirección de memoria que ocasiono la interrupción. 2- Determina el problema y llama a la rutina apropiada Si se trata de un acceso indebido el núcleo avisa al proceso mediante una señal. Puede ocurrir que sea el núcleo el que genero la interrupción. fastcall void do_page_fault(struct pt_regs *regs, unsigned long error_code) error_code: bit 0 == 0 means no page found, 1 means protection fault bit 1 == 0 means read, 1 means write bit 2 == 0 means kernel, 1 means user-mode Segmentation fault se envia señal al proceso: Force_sig(SIGSERV,task); Error del núcleo no ha podido tratar -> Detención del sistema. do_exit(SIGKILL);

TRATAMIENTO DE EXCEPCIONES Se obtiene el descriptor de la región de memoria afectada mediante la función find_vma, y luego comprueba el tipo de error: Si el error lo ha causado una pagina no presente en el segmento de la pila, se llama a la función expand_stack, para aumentar el tamaño de ésta. Si el error se debe a un acceso en escritura en una región protegida en lectura, el error se señala enviándole al proceso actual la señal SIGSEV. Si se accede a una página para escribir y esta compartida con protegida de lectura, se llama a la función do_wp_page. Si el error se debe a una página no presente en memoria, se llama a la función do_no_page, para cargarla.

TRATAMIENTO DE EXCEPCIONES do_wp_page: Gestiona la copia en escritura. Cuando un proceso accede en escritura a una página compartida y protegida en lectura exclusiva, se asigna una nueva página, y se comprueba si la página afectada es compartida por varios procesos. En caso afirmativo se copia su contenido en la nueva página, y se inserta en la tabla de páginas del proceso. El número de referencias a la anterior página se decrementa por la llamada a liberar la pagina. En el caso de que la página afectada no sea compartida, su protección simplemente se modifica para hacer posible la escritura.

TRATAMIENTO DE EXCEPCIONES static int do_wp_page(struct mm_struct *mm, struct vm_area_struct * vma, unsigned long address, pte_t *page_table, pmd_t *pmd, pte_t pte) { struct page *old_page, *new_page; unsigned long pfn = pte_pfn(pte); pte_t entry; //Se obtiene la pagina vieja. old_page = pfn_to_page(pfn); //comprueba la pagina no esta compartida if (!TestSetPageLocked(old_page)) { int reuse = can_share_swap_page(old_page); //se desbloquea la pagina ya que no esta compartida. unlock_page(old_page); if (reuse) { //se inserta en la tabla de paginas del proceso ptep_set_access_flags(vma, address, page_table, entry, 1); update_mmu_cache(vma, address, entry); pte_unmap(page_table); return VM_FAULT_MINOR; //devuelve 0 } …… /* se copia la pagina porque tiene protección */ new_page = alloc_zeroed_user_highpage(vma, address); if (!new_page) goto no_new_page;

TRATAMIENTO DE EXCEPCIONES …………….. …………. /* se recomprueba que la pagina que queremos traer no esta bloqueada. */ //se bloquea la tabla de paginas spin_lock(&mm->page_table_lock); page_table = pte_offset_map(pmd, address); if (likely(pte_same(*page_table, pte))) { …. new_page = old_page; } //se inserta en la tabla de paginas del proceso pte_unmap(page_table); //pone en la cache la pagina page_cache_release(new_page); page_cache_release(old_page); spin_unlock(&mm->page_table_lock); return VM_FAULT_MINOR; //devuelve 0 no_new_page: return VM_FAULT_OOM; //devuelve -1

TRATAMIENTO DE EXCEPCIONES do_swap_page: Carga en memoria el contenido de una pagina situada en el espacio de swap. Si una operación swapin está asociada a la región de memoria que contiene la página, se llama a esta función, en caso contrario se llama a la función swap_in. En ambos casos, la página asignada se inserta en el espacio de direccionamiento del proceso actual.

TRATAMIENTO DE EXCEPCIONES static int do_swap_page(struct mm_struct * mm, 1689 struct vm_area_struct * vma, unsigned long address, 1690 pte_t *page_table, pmd_t *pmd, pte_t orig_pte, int write_access) { 1692 struct page *page; 1693 swp_entry_t entry = pte_to_swp_entry(orig_pte); 1694 pte_t pte; 1695 int ret = VM_FAULT_MINOR; 1697 pte_unmap(page_table); 1698 spin_unlock(&mm->page_table_lock); //se comprueba que se tiene la pagina especifica 1699 page = lookup_swap_cache(entry); 1700 if (!page) { //se lee desde el area de swap un grupo de 2n paginas 1701 swapin_readahead(entry, address, vma); 1702 page = read_swap_cache_async(entry, vma, address); 1703 if (!page) { 1704 1708 spin_lock(&mm->page_table_lock); 1709 page_table = pte_offset_map(pmd, address); 1710 if (likely(pte_same(*page_table, orig_pte))) 1711 ret = VM_FAULT_OOM; 1712 else 1713 ret = VM_FAULT_MINOR; 1714 pte_unmap(page_table); 1715 spin_unlock(&mm->page_table_lock); 1716 goto out; 1717 } 1719 /* tiene que leer la pagina del area de swap Major fault */ 1720 ret = VM_FAULT_MAJOR; 1721 inc_page_state(pgmajfault); 1722 grab_swap_token(); 1723 }

TRATAMIENTO DE EXCEPCIONES do_no_page: Acceso a una página no presente en memoria. Se comprueba si la pagina ha sido descartada de la memoria y esta en el espacio swap: - do_swap_page En caso negativo se comprueba si existe una operación de memoria nopage asociada a la región que contiene la página. En caso afirmativo se usa esta operación para cargar el contenido en memoria, insertando la página en la tabla de páginas correspondiente. En caso negativo se asigna una nueva pagina rellenada con 0’s.

TRATAMIENTO DE EXCEPCIONES 1852 static int do_no_page(struct mm_struct *mm, struct vm_area_struct *vma, 1853 unsigned long address, int write_access, pte_t *page_table, pmd_t *pmd) 1854 { 1855 //declaran variables para la nueva estructura struct page * new_page; 1856 struct address_space *mapping = NULL; 1857 pte_t entry; 1858 unsigned int sequence = 0; 1859 int ret = VM_FAULT_MINOR; 1860 int anon = 0; ... 1867 //se localiza la pagina de memoria virtual 1868 if (vma->vm_file) { 1869 mapping = vma->vm_file->f_mapping; 1870 sequence = mapping->truncate_count; 1871 smp_rmb(); /* serializes i_size against truncate_count */ 1872 }

TRATAMIENTO DE EXCEPCIONES 1873 retry: 1874 cond_resched(); //obtenemos la nueva pagina 1875 new_page = vma->vm_ops->nopage(vma, address & PAGE_MASK, &ret); 1876 1883 1884 /* pagina no disponible */ 1885 if (new_page == NOPAGE_SIGBUS) 1886 return VM_FAULT_SIGBUS; 1887 if (new_page == NOPAGE_OOM) 1888 return VM_FAULT_OOM; 1889 1893 //se copia la pagina en memoria y en la cache de paginas copy_user_highpage(page, new_page, address); 1902 page_cache_release(new_page);//pone pagina en cache 1903 new_page = page; 1904 anon = 1; 1905 } 1906 }

TRATAMIENTO DE EXCEPCIONES ..... 1919 page_table = pte_offset_map(pmd, address); 1920 1932 if(anon) { 1944 lru_cache_add_active(new_page); 1945 page_add_anon_rmap(new_page, vma, address); 1946 } else // marcara la pagina como usada por este proceso 1947 page_add_file_rmap(new_page); 1948 pte_unmap(page_table); 1949 1958 update_mmu_cache(vma, address, entry); 1959 spin_unlock(&mm->page_table_lock); 1960 out: 1961 return ret; 1962 oom: 1963 page_cache_release(new_page); 1964 ret = VM_FAULT_OOM; 1965 goto out; 1966 }

TRATAMIENTO DE EXCEPCIONES No En interrupción o Kernel thread Si Pertenece a Una región No Si Si Pertenece a la Pila del modo usuario No Si Acceso de escritura No Pagina presente Si No Si No Región con permiso de escritura No En Modo usuario No Dirección incorrecta En una llamada al sistema Región legible o ejecutable No Si Si Copy on Write Paginacion Por demanda Enviar SIGSEGV Matar el proceso Y kernel “Ops” Fixup Code

Large Memory Page NOVEDADES VERSION 2.6 La página fisica en Linux 2.6 puede tener un tamaño de 4MB o 2 MB. Para 1 GB de memoria física: Page size Page table entries Memory space consumed (8 bytes /page table entry) 4 KB 262,144 2 MB 4 MB 256 2,048 bytes

Reverse Mapping: NOVEDADES VERSION 2.6 Page Page Table Table Proporciona un mecanismo para encontrar que procesos están usando la página física de la memoria. Page Table (Process 1) Page Table (Process 2) Physical Page PTE Chain

REVERSE MAPPING /* Comprueba si la pagina ha sido referenciada */ 393 int page_referenced(struct page *page, int is_locked, int ignore_token) { 395 int referenced = 0; 396 397 if (!swap_token_default_timeout) ignore_token = 1; 400 if (page_test_and_clear_young(page)) referenced++; 403 if (TestClearPageReferenced(page)) referenced++; 406 if (page_mapped(page) && page->mapping) { 407 if (PageAnon(page)) 408 referenced += page_referenced_anon(page, ignore_token); 409 else if (is_locked) 410 referenced += page_referenced_file(page, ignore_token); 411 else if (TestSetPageLocked(page)) 412 referenced++; 413 else { 414 if (page->mapping) 415 referenced += page_referenced_file(page, ignore_token); 417 unlock_page(page); 418 } 419 } 420 return referenced; 421 }

REVERSE MAPPING 423 /* Añade a la entrada de la tabla de pagina en memoria para una pagina anonima */ 431 void page_add_anon_rmap(struct page *page, 432 struct vm_area_struct *vma, unsigned long address) 433 { 434 struct anon_vma *anon_vma = vma->anon_vma; 435 pgoff_t index; 436 437 BUG_ON(PageReserved(page)); 438 BUG_ON(!anon_vma); 439 440 vma->vm_mm->anon_rss++; 441 442 anon_vma = (void *) anon_vma + PAGE_MAPPING_ANON; 443 index = (address - vma->vm_start) >> PAGE_SHIFT; 444 index += vma->vm_pgoff; 445 index >>= PAGE_CACHE_SHIFT - PAGE_SHIFT; 446 447 if (atomic_inc_and_test(&page->_mapcount)) { 448 page->index = index; 449 page->mapping = (struct address_space *) anon_vma; 450 inc_page_state(nr_mapped); 451 } 452 /* else checking page index and mapping is racy */ 453 }

REVERSE MAPPING /* Añade a la entrada de la tabla de pagina en memoria para un fichero de pagina */ 461 void page_add_file_rmap(struct page *page) 462 { 463 BUG_ON(PageAnon(page)); 464 if (!pfn_valid(page_to_pfn(page)) || PageReserved(page)) 465 return; 466 467 if (atomic_inc_and_test(&page->_mapcount)) 468 inc_page_state(nr_mapped); 469 } 471 /* Quitar de la memoria el pte de una pagina */ 477 void page_remove_rmap(struct page *page) 478 { 479 BUG_ON(PageReserved(page)); 480 481 if (atomic_add_negative(-1, &page->_mapcount)) { 482 BUG_ON(page_mapcount(page) < 0); 492 if (page_test_and_clear_dirty(page)) 493 set_page_dirty(page); 494 dec_page_state(nr_mapped); 495 } 496 }

REVERSE MAPPING 838 /* Intenta liberar toda tabla de paginas de memoria para una pagina dada. Los valores devueltos son: SWAP_SUCCESS,SWAP_AGAIN,SWAP_FAIL */ 850 int try_to_unmap(struct page *page) 851 { 852 int ret; 853 854 BUG_ON(PageReserved(page)); 855 BUG_ON(!PageLocked(page)); 856 857 if (PageAnon(page)) 858 ret = try_to_unmap_anon(page); 859 else 860 ret = try_to_unmap_file(page); 861 862 if (!page_mapped(page)) 863 ret = SWAP_SUCCESS; 864 return ret; 865 }