Publicado el 31 de Julio del 2019
529 visualizaciones desde el 31 de Julio del 2019
94,4 KB
13 paginas
Creado hace 5a (16/05/2018)
Hacia la memoria
virtual
Recordatorio: fases de la compilación
int nota[128];
int media[128];
for (i=0;i<128;i++) {
if (i>7 &&i<64) {
nota[i] = media[i]/2;
}
else {
a = nota[i]*media[i]
}
}
Ensamblado
•
•
¿Cuántos bloques de cache ocupa el código?
¿Serán bloques consecutivos? ¿Habrá conflictos?
bucleFor: cmp r0,#128
.data
nota: .word 128
media: .word 128
.text
1
2
3
4
5
6
7
8
9
10
11
12
13
14
beq finBucle
cmp r0,#7
bne ramaElse
cmp r0,#64
bge ramaElse
ldr r1,[r4,r0,lsl#2]
lsr r1,r1,#1
str r1,[r5,r0,lsl#2]
b finIf
ramaElse: ldr r1,[r4,r0,lsl#2]
ldr r2,[r5,r0,lsl#2]
mul r3,r1,r2
finIf: add r0,r0,#1
15
16
b bucleFor
finBucle: b .
Enlazado
bucleFor: cmp r0,#128
.data
nota: .word 128
media: .word 128
.text
1
2
3
4
5
6
7
8
9
10
11
12
13
14
beq finBucle
cmp r0,#7
bne ramaElse
cmp r0,#64
bge ramaElse
ldr r1,[r4,r0,lsl#2]
lsr r1,r1,#1
str r1,[r5,r0,lsl#2]
b finIf
ramaElse: ldr r1,[r4,r0,lsl#2]
ldr r2,[r5,r0,lsl#2]
mul r3,r1,r2
finIf: add r0,r0,#1
15
16
b bucleFor
finBucle: b .
Enlazado
Fichero ELF
.data 0x000000000
.text 0x0C0000000
entry 0x0C0000000
Symbol table
…
0100100010001
0000100101010
….
Sistema real
• El ejecutable se almacenará en el disco
Memoria
CPU
PC
elf
Ejecución
• Escribir parte del ejecutable en memoria
• Al menos, las instrucciones y los datos globales.
• Además, crear espacio para la pila
• Escribir en PC la dirección de la primera instrucción
• El entry point especficiado en el fichero ELF
Memoria
Código
Datos
Pila
CPU
0x0c00000
PC
0
elf
• ¿En qué direcciones de memoria se escriben el código y los datos?
Sobre le ejecución….
• ¿ Y, si antes de que termine esa aplicación, ejecutamos otra?
• El proceso será similar: escribir en memoria las instrucciones y datos…
• ¿En qué direcciones escribiremos su código / datos?
• ¿Puede el compilador asegurar que generará direcciones diferentes
para cada posible aplicación que lancemos?
• ¿Y si ejecutamos dos veces la misma aplicación? (sin dejar que termine la
primera instancia)
Más problemas….
• ¿Y si nuestra aplicación es tan grande (muchas instrucciones, muchos
datos..) que no cabe en memoria principal?
• Recordar el maletín del laboratorio:
• 32 bits de direcciones
• Hasta 4GB de espacio direccionable
• Pero sólo unos pocos MB de memoria SDRAM real
• Y otros pocos Kbytes del espacio dedicados a dispositivos de E/S
¿Quién/cuándo asigna direcciones?
CPU
PC
Cargador
Memoria
datos
código
datos
código
Compilador
(+ enlazado)
App1.elf
código
datos
App2.elf
datos
código
¿Quién/cuándo asigna direcciones?
• ¿Quién?
• ¿Cuándo?
• Compilador/enlazador
• Cargador (parte del SO)
• En tiempo de
compilación/enlazado
• En el momento de la carga del
ejecutable a memoria
• Durante la ejecución
IDEA FUNDAMENTAL
• La aplicación/tarea y el procesador manejan direcciones virtuales
(también llamadas lógicas en algún contexto)
• Son las generadas por el compilador/enlazador
• Durante la ejecución la MMU (Memory Management Unit) traduce
las direcciones virtuales en direcciones físicas
• Las direcciones físicas son las que se envían al controlador de memoria para
solicitar el acceso a memoria principal
¿Con qué granularidad hacemos la
traducción?
• Por secciones
• se traduce la dirección de comienzo de .text, .data….
• Se mantiene la organización interna de cada sección (como la decidió el
compilador)
• A favor: la traducción de cada sección consiste únicamente en sumar una
constante
• En contra: no soluciona el problema de los mapas virtuales grandes.
¿Con qué granularidad hacemos la
traducción?
• Por palabras
• Cada palabra del espacio virtual se traduce a una nueva ubicación en el
espacio físico
• La implementación se haría mediante una tabla con tantas entradas como
palabras tenga nuestro espacio virtual
• Si el procesador es de 32 bits, nuestras aplicaciones pueden tener espacios virtuales de
• CADA aplicación (tarea) necesita una tabla con 230 entradas, cada una de ellas de (por
232 bytes 230 palabras
ejemplo) 4 bytes
• IMPOSIBLE en la práctica
¿Con qué granularidad hacemos la
traducción?
• Por conjuntos de palabras página
• Cada página del espacio virtual se traduce a una nueva ubicación en el
espacio físico (un marco de página o página física)
• La implementación se haría mediante una tabla con tantas entradas como
páginas tenga nuestro espacio virtual
• Si el procesador es de 32 bits, nuestras aplicaciones pueden tener espacios virtuales de
232 bytes
• Tamaño de página típico: 4Kbytes
• CADA aplicación (tarea) necesita una tabla con 220 entradas, cada una de ellas de (por
ejemplo) 4 bytes
• Aún muy grande, pero veremos cómo hacerlo manejable
Comentarios de: Hacia la memoria virtual (0)
No hay comentarios