MMU Tareas - Universidad de Buenos Aires

´ 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