ppt - Universidad de Sonora

Download Report

Transcript ppt - Universidad de Sonora

Traduciendo y ejecutando
programas
El camino de un programa en C
Universidad de Sonora
Arquitectura de Computadoras
2
Compilador
 Compilador
 Traduce de lenguaje C a lenguaje ensamblador.
Universidad de Sonora
Arquitectura de Computadoras
3
Hola Mundo en C
# include <stdio.h>
void main ()
{
printf ("Hola mundo\n");
}
Universidad de Sonora
Arquitectura de Computadoras
4
Ensamblador (BCC55)
ifdef ??version
if ??version GT 500H
.mmx
endif
endif
model flat
ifndef ??version
?debug macro
endm
endif
?debug S "hola_mundo.c"
?debug T "hola_mundo.c"
_TEXT
segment dword public use32 'CODE'
_TEXT
ends
_DATA
segment dword public use32 'DATA'
_DATA
ends
_BSS
segment dword public use32 'BSS'
_BSS
ends
DGROUP group
_BSS,_DATA
Universidad de Sonora
Arquitectura de Computadoras
5
Ensamblador (BCC55)
_TEXT
segment dword public use32 'CODE'
_main
proc
near
?live1@0:
;
; void main ()
;
push ebp
mov
ebp,esp
;
; {
;
printf ("Hola mundo\n");
;
@1:
push offset s@
call _printf
pop
ecx
;
; }
;
@2:
pop
ebp
ret
_main
endp
_TEXT
ends
Universidad de Sonora
Arquitectura de Computadoras
6
Ensamblador (BCC55)
_DATA segment dword public use32 'DATA'
s@label byte
;
s@+0:
db
"Hola mundo",10,0
align 4
_DATA ends
_TEXT
segment dword public use32 'CODE'
_TEXT
ends
public _main
extrn _printf:near
?debugD "c:\Borland\BCC55\Include\_nfile.h" 10459 6176
?debugD "c:\Borland\BCC55\Include\_null.h" 10459 6176
?debugD "c:\Borland\BCC55\Include\_defs.h" 10459 6176
?debugD "c:\Borland\BCC55\Include\_stddef.h" 10459 6176
?debugD "c:\Borland\BCC55\Include\stdio.h" 10459 6176
?debugD "hola_mundo.c" 14910 22993
end
Universidad de Sonora
Arquitectura de Computadoras
7
Programa Ensamblador
 Acepta un programa en lenguaje ensamblador y genera
un archivo objeto.
 El archivo objeto contiene:
 Instrucciones en lenguaje de máquina.
 Datos.
 Información necesaria para cargar el programa en
memoria.
Universidad de Sonora
Arquitectura de Computadoras
8
Típico OBJ de Unix
Encabezado. Describe el tamaño y posición de otras
secciones del archivo objeto.
2. Segmento de texto. Contiene el código en lenguaje
máquina.
3. Segmento de datos estáticos. Variables accesibles
durante todo el programa (globales y variables static
de C).
4. Información de relocalización. Identifica
instrucciones que dependen de direcciones
absolutas.
1.
Universidad de Sonora
Arquitectura de Computadoras
9
Típico OBJ de Unix
5. Tabla de símbolos. Etiquetas que no han sido
definidas como variables externas.
6. Información útil para un debugger. Permite asociar
instrucciones de máquina con líneas del código
fuente original.
Universidad de Sonora
Arquitectura de Computadoras
10
Microsoft COFF
 Common Object File Format.
 Inicialmente definido para Unix V, fue extendido por
Microsoft para Windows 3.1.
 Se usa en todas las versiones de Windows de 32 y 64
bits.
Universidad de Sonora
Arquitectura de Computadoras
11
Microsoft COFF
Encabezado
Encabezados de sección
Código
Datos
Información para relocalizar
Información para depuración
Universidad de Sonora
Arquitectura de Computadoras
12
Linker
 Pega (link) varios archivos objeto compilados
posiblemente por separado.
 Resuelve referencias externas e internas.
 En algunos sistemas como Windows, el linker
relocaliza el código.
 Produce un solo archivo ejecutable.
Universidad de Sonora
Arquitectura de Computadoras
13
Relocalización
 Ensamblador
bne $t0, $t1, brinco ; if t0 != t1 goto brinco
…
brinco: etc.
 Lenguaje máquina
1000 bne $8, $9, 1020
…
1020 etc.
Universidad de Sonora
Arquitectura de Computadoras
14
Relocalización
 La instrucción
1000 bne $8, $9, 1020
está asumiendo que va ser cargada en la dirección
1000.
 Los sistemas operativos modernos (multiusuario y/o
multitarea) cargan en memoria varios programas a la
vez y pueden ser colocados en áreas distintas cada vez
que corren.
Universidad de Sonora
Arquitectura de Computadoras
15
Relocalización
 La solución (para este caso) es hacer el brinco relativo.
1000 bne $8, $9, +20
 En general, hay que guardar información sobre
dependencias en el código.
Universidad de Sonora
Arquitectura de Computadoras
16
Ejemplo – archivo objeto A
Encabezado
Segmento de texto
Segmento de datos
Información de
relocalización
Tabla de símbolos
Universidad de Sonora
Nombre:
Procedure A
Tamaño de código:
0x100
Tamaño de datos:
0x20
Dirección
Instrucción
Significado
0
lw $a0, 0($gp)
$a0 ← Mem[X]
4
jal 0
call B
…
…
…
0
(X)
…
…
Dirección
Tipo de instrucción
Dependencia
0
lw
X
4
jal
B
Etiqueta
Dirección
X
---
B
---
Arquitectura de Computadoras
17
Ejemplo – archivo objeto B
Encabezado
Segmento de texto
Segmento de datos
Información de
relocalización
Tabla de símbolos
Universidad de Sonora
Nombre:
Procedure B
Tamaño de código:
0x200
Tamaño de datos:
0x30
Dirección
Instrucción
Significado
0
sw $a1, 0($gp)
Mem[Y] ← $a1
4
jal 0
call A
…
…
…
0
(Y)
…
…
Dirección
Tipo de instrucción
Dependencia
0
sw
Y
4
jal
A
Etiqueta
Dirección
Y
---
A
---
Arquitectura de Computadoras
18
Ejemplo - relocalizando
 El procedimiento A necesita encontrar la dirección de
la variable X y del procedimiento B.
 El procedimiento B necesita encontrar la dirección de
la variable Y y del procedimiento A.
 En MIPS, el segmento de texto comienza en la
dirección 400,00016.
 A se carga a partir de 400,00016 y como el código de A
mide 10016, B se carga a partir de 400,10016.
Universidad de Sonora
Arquitectura de Computadoras
19
Ejemplo - relocalizando
 El segmento de datos comienza en la dirección
10,000,00016.
 Los datos de A se cargan en 10,000,00016 y como miden
2016, los datos de B se cargan en 10,000,02016.
 El registro $gp se inicializa en 10,008,00016.
 Los datos de A se accesan con $gp – 8,00016.
 Los datos de B se accesan con $gp – 7,98016.
 Con esta información, el linker puede relocalizar el
código y generar un archivo ejecutable.
Universidad de Sonora
Arquitectura de Computadoras
20
Ejemplo - ejecutable
Encabezado
Segmento de texto
Segmento de datos
Universidad de Sonora
Tamaño de código:
0x300
Tamaño de datos:
0x50
Dirección
Instrucción
0x400,000
lw $a0, 0x8000($gp)
0x400,004
jal 0x400100
…
…
0x400,100
sw $a1, 0x8020($gp)
0x400,104
jal 0x400000
…
…
Dirección
0x10,000,000
(X)
…
…
0x10,000,020
(Y)
…
…
Arquitectura de Computadoras
21
Referencias externas
 Se generan al compilar archivos por separado.
 Archivo “hola.c”
void foo (void); // prototipo
void main ()
{
foo (); // referencia externa
}
Universidad de Sonora
Arquitectura de Computadoras
22
Referencias externas
 Archivo “mundo.c”
#include <stdio.h>
void foo ()
{
printf ("hola mundo\n");
}
Universidad de Sonora
Arquitectura de Computadoras
23
Referencias externas
Compilación usando Borland C 5.5
bcc32 –c hola.c
Compila sin ligar y genera hola.obj
2. bcc32 –c mundo.c
Compila sin ligar y genera mundo.obj
3. bcc32 hola.obj mundo.obj
Invoca al linker y genera hola.exe
1.
Universidad de Sonora
Arquitectura de Computadoras
24
Archivos ejecutables
 Definición del Merriam-Webster:
Archivo que hace que una computadora “realice tareas
de acuerdo a instrucciones codificadas.”
 Formatos más comunes:
 a.out (Unix)
 .com (CP/M y MS-DOS)
 .exe (MS-DOS y Windows) formalmente llamado PE
(Portable executable).
Universidad de Sonora
Arquitectura de Computadoras
25
Microsoft PE

Portable Executable.
 Formato:
1.
2.
3.
4.
5.
6.
Encabezado EXE de MS-DOS (por compatibilidad).
Mini-programa MS-DOS: “This program cannot be run
in DOS mode”.
Encabezado PE.
Encabezados de las secciones.
Sección .text: código.
Sección .data: datos estáticos.
Universidad de Sonora
Arquitectura de Computadoras
26
Microsoft PE
7.
8.
9.
10.
11.
12.
Sección .edata: tabla de símbolos exportados (usado
por DLLs).
Sección .idata: tabla de símbolos importados.
Sección .rdata: datos de solo lectura (constantes y
strings).
Sección .tls: variables globales que pueden ser
accesadas como variables locales por hilos (threads).
Sección .rsrc: recursos como menús y diálogos.
Sección .reloc: información de relocalización.
Universidad de Sonora
Arquitectura de Computadoras
27
Microsoft PE
Universidad de Sonora
Arquitectura de Computadoras
28
Cargadores

Conocidos en inglés como “loaders”.
 Carga el programa ejecutable en la memoria y le cede
el control.
 En algunos sistemas operativos como MS-DOS el
cargador es el que relocaliza el código.
Universidad de Sonora
Arquitectura de Computadoras
29
Cargador típico de Unix
Lee el ejecutable y determina el tamaño de los
segmentos de texto y datos.
2. Crea un espacio de direcciones suficientemente
grande para el texto y los datos.
3. Copia las instrucciones y datos a la memoria.
4. Copia los parámetros del programa principal (si es
que existen) en la pila.
1.
Universidad de Sonora
Arquitectura de Computadoras
30
Cargador típico de Unix
5. Inicializa los registros incluyendo el apuntador a la
pila (sp).
6. Brinca a una rutina de start-up que copia los
parámetros en los registros y llama a la rutina
principal.
7. Cuando la rutina principal regresa, la rutina de startup termina el programa con una llamada al sistema
de exit.
Universidad de Sonora
Arquitectura de Computadoras
31
Resumen
Compilador. Traduce el programa a lenguaje
ensamblador.
2. Ensamblador. Genera un archivo objeto por cada
archivo en ensamblador.
3. Linker. Resuelve referencias, relocaliza y genera un
ejecutable.
4. Cargador. Carga el ejecutable en memoria y lo corre.
1.


El compilador típico incluye los 3 primeros pasos.
El cargador es parte del sistema operativo.
Universidad de Sonora
Arquitectura de Computadoras
32
Camino de un programa en Java
Universidad de Sonora
Arquitectura de Computadoras
33
Compilador
 El compilador de Java genera un archivo class por cada
clase compilada.
 El archivo class contiene:
 Tabla de métodos válidos con sus bytecodes.
 Información extra, como la clase padre.
 Los bytecodes son las instrucciones de la máquina
virtual de Java (JVM) y son independientes del
hardware.
 “Compila una vez, corre donde sea” (compile once, run
anywhere).
Universidad de Sonora
Arquitectura de Computadoras
34
JVM
 La máquina virtual de Java interpreta y ejecuta los
bytecodes.
 Algunas JVMs incluyen un compilador JIT (just-intime) que compila los bytecodes a código máquina
conforme el programa está corriendo.
Universidad de Sonora
Arquitectura de Computadoras
35
Universidad de Sonora
Arquitectura de Computadoras
36
Explicación
 Algunos mnemónicos usan un prefijo:
 a – dirección.
 b – byte (8 bits).
 i – entero (32 bits).
 s – short (16 bits).
 I8 es una constante de 8 bits.
 I16 es una constante de 16 bits.
Universidad de Sonora
Arquitectura de Computadoras
37
Explicación
 La JVM usa una pila para guardar resultados
intermedios.
 Los operandos se guardan en la pila, se hace la
operación y se sacan.
 El compilador sabe el tamaño máximo de la pila de
operandos para cada método y le asigna espacio en el
frame actual.
Universidad de Sonora
Arquitectura de Computadoras
38
Explicación
 TOS = tope de la pila.
 NOS = siguiente posición debajo del TOS.
 NNOS = siguiente posición debajo del NOS.
 pop. Quita el TOS.
 pop2. Quita el TOS y el NOS.
 push. Agrega un elemento a la pila.
 Const[] se refiere al pool de constantes de la clase
creado por la JVM al momento de correr.
 Frame[] a las variables en el frame local del método.
Universidad de Sonora
Arquitectura de Computadoras
39
Diferencias entre JVM y MIPS
Para guardar resultados temporales: MIPS usa
registros, JVM una pila.
2. Tamaño de instrucción: MIPS 4 bytes, JVM de 1 a 5
bytes para ahorrar espacio.
3. JVM tiene seguridad integrada. Por ejemplo, en un
arreglo, la JVM checa que la referencia al arreglo sea
válida y que el índice esté dentro del límite.
1.
Universidad de Sonora
Arquitectura de Computadoras
40
Diferencias entre JVM y MIPS
4. Para que el recolector de basura encuentre los
apuntadores “vivos”, JVM tiene instrucciones
distintas para operar con direcciones y para operar
con enteros.
5. JVM tiene instrucciones complejas como crear
espacio para un arreglo o invocar un método.
Universidad de Sonora
Arquitectura de Computadoras
41
Comparación entre JVM y MIPS
 Compilar el siguiente código en C/Java a MIPS y JVM:
while (save[i] == k)
i += 1;
Universidad de Sonora
Arquitectura de Computadoras
42
MIPS
; s3 = i, s5 = k, s6 = dirección de save
ciclo:
sll $t1, $s3, 2
; t1 = i * 4 / t1 = tiene el offset
add $t1, $t1, $s6
; t1 apunta a save[i]
lw $t0, 0($t1)
; t0 = save[i]
bne $t0, $s5, Exit
; if save[i]  k goto Exit
add $s3, $s3, 1
; i++
j ciclo
; goto ciclo
Exit:
Universidad de Sonora
Arquitectura de Computadoras
43
JVM
; i, k y save son las primeras tres variables locales.
0 aload_3
; push variable local 3 (save)
1 iload_1
; push variable local 1 (i)
2 iaload
; pop TOS y NTOS y push save[i]
3 iload_2
; push variable local 2 (k)
4 if_icompne, Exit ; compara TOS y NTOS, los saca y
; brinca si no son iguales
7 iinc, 1, 1
; i++
10 go to 0
; brinca al inicio (byte 0)
Universidad de Sonora
Arquitectura de Computadoras
44
Comparación entre JVM y MIPS
 MIPS: 6 instrucciones, 24 bytes.
 JVM: 7 instrucciones, 13 bytes.
 La diferencia es mayor si tomamos en cuenta que la
JVM checa automáticamente que los accesos al arreglo
estén dentro del rango.
 Ciclo while modificado en MIPS para checar rangos
ocupa 11 instrucciones, es decir, 44 bytes.
Universidad de Sonora
Arquitectura de Computadoras
45
Ciclo while en MIPS
; s3 = i, s5 = k, s6 = dirección de save
; s6 apunta a la lista de métodos legales para save
; s6 + 4 apunta al tamaño del arreglo
; s6 + 8 apunta a save[0] (primer elemento)
lw $t2, 4($s6)
; t2 = tamaño del arreglo
ciclo:
slt $t0, $s3, 0
; if i < 0
bne $t0, $zero, IndexOutOfBounds ; goto Error
slt $t0, $s3, $t2
; if i  tamaño
beq $t0, $zero, IndexOutOfBounds ; goto Error
Universidad de Sonora
Arquitectura de Computadoras
46
Ciclo while en MIPS
sll $t1, $s3, 2
add $t1, $t1, $s6
lw $t0, 8($t1)
bne $t0, $s5, Exit
add $s3, $s3, 1
j ciclo
Exit:
Universidad de Sonora
; t1 = i * 4 / t1 = tiene el offset
; t1 apunta a save[i]
; t0 = save[i]
; if save[i]  k goto Exit
; i++
; goto ciclo
Arquitectura de Computadoras
47
Invocando métodos en Java


1.
2.
3.
4.
El compilador escoge el método apropiado
dependiendo del tipo (clase) del objeto.
El compilador genera código para:
Revisar que objeto no sea nulo, y en su caso brincar a
una rutina de error.
Cargar la lista de métodos válidos para ese objeto. La
primera palabra guarda un apuntador a esa tabla.
Cargar la dirección del método apropiado, dejando la
dirección de regreso en la pila.
Brincar al inicio del método.
Universidad de Sonora
Arquitectura de Computadoras
48
Compilado vs. Interpretado
 Ventaja de un programa interpretado: portabilidad.
 Ventaja de un programa compilado: rapidez de
ejecución.
 Los compiladores JIT tratan de reducir esa ventaja.
Universidad de Sonora
Arquitectura de Computadoras
49
Compilado vs. Interpretado
Universidad de Sonora
Arquitectura de Computadoras
50
Conceptos importantes
 Compilador.
 Ensamblador.
 Linker.
 Cargador o loader.
 Relocalización.
 Referencias internas.
 Referencias externas.
 Intérprete.
 Compilador JIT (just-in-time).
Universidad de Sonora
Arquitectura de Computadoras
51