´ MMU Basica ´ Paginacion: Francisco Giordano ´ Departamento de Computacion Facultad de Ciencias Exactas y Naturales Universidad de Buenos Aires 28 de mayo de 2015 1 / 17 ´ kernel La clase pasada: Paginacion ´ 1. Armaron un directorio de paginas con identity mapping para el rango ´ 0x00000000 – 0x003FFFFF (kernel y area libre). ´ 2. Activaron paginacion. call mmu_inicializar_dir_kernel mov cr3, eax mov eax, cr0 or eax, 0x80000000 mov cr0, eax 2 / 17 ´ para tareas pirata Hoy... Preparando paginacion I ˜ Hoy van a implementar una pequena Memory Management Unit. I ¿Que´ tiene que poder hacer? I Inicializar sus estructuras internas I Inicializar el mapa de memoria de una tarea I ´ Mapear paginas f´ısicas en p´aginas virtuales I ´ Desmapear paginas 3 / 17 Mapa de memoria de una tarea Memoria Física area libre 0x0FFFFF 0x100000 identity mapping (nivel 0) 0x0FFFFF 0x100000 BootSector Kernel Video Bios Paginas libres para como directorios, tablas de pagina y pilas de nivel 0 0x3FFFFF 0x400000 el mapa 0x3FFFFF 0x400000 0x500000 0x000000 kernel 0x000000 Memoria Virtual Codigo y pila r/w 0x0800000 Mapa de memoria de juego, donde almacenar el código de los piratas r/o 0x121FFFF 0x1520000 4 / 17 ´ ¿Como construimos el mapa de memoria de una tarea? Dos partes 1. Identity mapping ´ 2. Codigo de tarea I Necesitamos un lugar libre donde colocar un directorio y tablas de ´ ´ pagina. Para esto es el area libre del kernel. 5 / 17 ´ ¿Como construimos el mapa de memoria de una tarea? Dos partes 1. Identity mapping ´ 2. Codigo de tarea I Necesitamos un lugar libre donde colocar un directorio y tablas de ´ ´ pagina. Para esto es el area libre del kernel. I Creamos una tabla y la vinculamos con el directorio. I Hacemos identity mapping sobre las direcciones 0x00000000 a 0x003FFFFF. 6 / 17 ´ ¿Como construimos el mapa de memoria de una tarea? Dos partes 1. Identity mapping ´ 2. Codigo de tarea I Necesitamos un lugar libre donde colocar un directorio y tablas de ´ ´ pagina. Para esto es el area libre del kernel. I Creamos una tabla y la vinculamos con el directorio. I Hacemos identity mapping sobre las direcciones 0x00000000 a 0x003FFFFF. I ´ Luego, necesitamos copiar y mapear la pa´ gina de codigo. I I ´ virtual 0x400000. Esto es en la direccion ´ f´ısica la mapeamos? ¿A que´ direccion 7 / 17 ´ Mapear Paginas ´ ´ Para llevar a cabo esto ultimo, usaremos una funcion: I void mmu mapear unsigned unsigned unsigned unsigned pagina( int virtual, int cr3, int fisica, int attrs) Se encarga de mapear direcciones virtuales a direcciones f´ısicas en un mapa ´ de un directorio de p´aginas). de memoria dado (a traves 8 / 17 Directorios y tablas... 9 / 17 Mapear ´ virtual y la descomponemos en sus partes: 1. Tomamos la direccion I ´ Indice en el directorio, I ´ Indice en en la tabla y I ´ Desplazamiento dentro de la pagina (no la vamos a necesitar). 2. Obtenemos la PDE correspondiente. 3. Obtenemos la PTE correspondiente. ´ corresponda. 4. Completamos la PTE segun 10 / 17 PDE 11 / 17 PTE 12 / 17 Finalmente... I ´ tlbflush() para invalidar la cache de Deben ejecutar la funcion ´ de direcciones (en mmu mapear pagina). traduccion 13 / 17 Ejercicio 4 Implementar en mmu.c las funciones: I I mmu inicializar mmu inicializar dir pirata ´ (no olvidarse de copiar el codigo de las tareas...) I mmu mapear pagina I mmu unmapear pagina 14 / 17 Ejercicio 4 Adema´ s, deben probar que las funciones que implementaron hacen lo que se supone que hacen. Para eso, en kernel.asm: I Llaman a mmu inicializar y luego I a mmu inicializar dir pirata I ´ Cambian el cr3 actual por el que retorna la funcion I y cambian el color del fondo del primer caracter de la pantalla. 15 / 17 ´ Algunas macros de C utiles... #define PDE INDEX(virtual) ??? #define PTE INDEX(virtual) ??? #define ALIGN(dir) ??? #define PG PRESENT ??? #define PG READ WRITE ??? #define PG USER ??? 16 / 17 ¿Preguntas? 17 / 17
© Copyright 2024