Visión general Escuela de Ingeniería Civil en Informática Universidad de Valparaíso, Chile http://informatica.uv.cl 1 Visión general C: Java: auto *a = malloc(sizeof(auto)); a->kilometraje = 100; a->litros_bencina = 17; float kph = get_kph(a); free(a); Lenguaje assembler Lenguaje máquina Auto a = new Auto(); a.setKilometraje(100); a.setlitros_bencina(17); float kph = a.getKph(); getMpg: pushq %rbp movq %rsp, %rsp . . . popq %rpb ret 01010101010110001010 . . . 010101010100010111010 Sistema opera=vo Sistema Computacional Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 2 Visión general Código Fuente .c Código Fuente .c Bibliotecas .h Compilador Código Fuente .c Bibliotecas .h Bibliotecas .h Código Assembler .s Código Assembler .s Código Assembler .s Código Objetvo .o Código Objetvo .o Código Objetvo .o Ensamblador Librerías del sistema Linker (enlazador) Ejecutable Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 3 Hardware: Modelo lógico CPU Memoria Disco Duro Teclado Monitor USB Controladores de HW Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 4 Hardware: Modelo lógico Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 5 Hardware: Vista Física Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 6 Ejecución/desempeño de programas Registros Banco de Registros R1 R2 Caché Interna Rn CPU Memoria RAM Pocos Man=enen los datos de ejecución del programa Desempeño NO depende sólo de la velocidad del procesador Capacidad de canal (Ancho de Banda) entre CPU y Memoria puede limitar el desempeño en la ejecución de programas Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 7 Memoria, Datos y direccionamiento Representación de la información Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 8 Codificación Binario Ejemplo: 001010112 =32+8+2+1=4310 Hexadecimal Dígitos: 0 al F Cada dígito hexadecimal son 4 dígitos binarios Ejemplo: FA1D38E16 Ejemplo: 0xFA1D38E Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 9 Palabras de Máquina Cada arquitectura =ene un “tamaño de palabra” Es el tamaño nominal del =po de dato entero. Define la can=dad de registros de memoria que puede direccionar. Máquinas de palabras de 32 bits #registros= 232 Máquinas de palabras de 64 bits #registros= 264 Por compa=bilidad, los procesadores actuales soportan dis=ntos tamaños de palabra, siempre de la forma 2n. Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 10 Memoria Organización orientada al Byte Arreglo, cuyo índice se llama “Dirección de memoria”. Cada lugar del arreglo, con=ene exactamente 1 byte de datos. Los programas referencian esas direcciones para guardar/sacar datos. Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 11 Memoria Organización orientada a la palabra La dirección de memoria apunta a un conjunto de bytes La dirección es la dirección del primer bytes de la palabra La dirección siguiente difiere por 4 (caso 32 bit) u 8 (caso 64bit) Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 12 Memoria, Datos y direccionamiento Organización y direccionamiento de datos en memoria Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 13 Direcciones y punteros Dirección: Localización en memoria Puntero: dato que con=ene una dirección Por ejemplo La dirección 0x004 almacena el valor 0x0000015F Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 14 Direcciones y punteros Dirección: Localización en memoria Puntero: dato que con=ene una dirección Por ejemplo La dirección 0x004 almacena el valor 0x0000015F El puntero a la dirección 0x004 se almacena en la dirección 0x001C Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 15 Direcciones y punteros Dirección: Puntero: Localización en memoria dato que con=ene una dirección Por ejemplo La dirección 0x004 almacena el valor 0x0000015F El puntero a la dirección 0x004 se almacena en la dirección 0x001C El puntero al puntero de la dirección 0x004 se almacena en la dirección 0x0024 Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 16 Direcciones y punteros Dirección: Puntero: Localización en memoria dato que con=ene una dirección Por ejemplo El valor almacenado en 0x0014, ¿es un puntero?, ¿podría ser un puntero?, ¿no es un puntero? Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 17 Direcciones y punteros Tamaño de los =pos de datos (bytes) Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 18 Orden de los bytes ¿Qué dato está almacenado en la dirección 0x004? 0x0000015F 0x5F010000 Dos convenciones Big Endian Lille Endian Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 19 Orden de los bytes Big Endian Byte más significa=vos en las direcciones más bajas (PowerPC, sun, Internet) Lille Endian Byte más significa=vos en las direcciones más altas (intel) Ejemplo Variable de 4 Bytes: 0x01234567 La dirección es 0x100. Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 20 Orden de los bytes Ejemplo código “detector” #include <stdio.h> #include <stdlib.h> int main() { union { short s; char c[sizeof(short)]; } un; un.s = 0x0102; if(sizeof(short) == 2){ if(un.c[0] == 1 && un.c[1] == 2) printf("big-endian\n"); else if(un.c[0] == 2 && un.c[1] == 1) printf("little-endian\n"); else printf("unknown\n"); } else{ printf("sizeof(short) = %lu\n", sizeof(short)); } return(EXIT_SUCCESS); } Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 21 Orden de los bytes Ejemplo Complemento 2 Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 22 Manipulación de datos en memoria Escuela de Ingeniería Civil en Informática Universidad de Valparaíso, Chile http://informatica.uv.cl 23 Direcciones y punteros en C Declaración de variables int x,y; &: dirección de un valor * : valor en una dirección Encuentre dos localizaciones de memoria en las que almacenará 2 enteros (en 1 palabra cada uno) Declaración de punteros int *pa; Declara que pa es un puntero a un dato que es un entero. Asignación a un puntero pa = &x; Asigna a pa un puntero a la dirección en la que x está almacenada. Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 24 Direcciones y punteros en C Aclaraciones *pa : es el valor en la dirección de memoria dada por el valor de pa Ejemplos: int x,y; int *pa; x=100; pa = &x; &: dirección de un valor * : valor en una dirección y = *pa + 1 ¿cuánto vale y? ¿A qué es equivalente *(&x) ? pa = pa +1; Si ptr = 0x500, cuánto vale pa=pa+1? Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 25 Asignaciones en C Estructura genérica Lep-­‐Hand-­‐Side = Right-­‐Hand-­‐Side LHS debe contener un localización de memoria (AKA variable) RHS debe contener un valor. (Puede ser una dirección) Ejemplo 1 x vale 0x0 y vale 0x3CD02700 Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 26 Asignaciones en C Estructura genérica Lep-­‐Hand-­‐Side = Right-­‐Hand-­‐Side LHS debe contener un localización de memoria (AKA variable) RHS debe contener un valor. (Puede ser una dirección) Ejemplo 1 x vale 0x0 y vale 0x3CD02700 int x,y; x = y + 3; Tome el valor de y, súmelo 3 y guárdelo en la dirección de memoria x Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 27 Asignaciones en C Estructura genérica Lep-­‐Hand-­‐Side = Right-­‐Hand-­‐Side LHS debe contener un localización de memoria (AKA variable) RHS debe contener un valor. (Puede ser una dirección) Ejemplo 1 x vale 0x0 y vale 0x3CD02700 int x,y; x = y + 3; Tome el valor de y, súmelo 3 y guárdelo en la dirección de memoria x Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 28 Asignaciones en C Estructura genérica Lep-­‐Hand-­‐Side = Right-­‐Hand-­‐Side LHS debe contener un localización de memoria (AKA variable) RHS debe contener un valor. (Puede ser una dirección) Ejemplo 2 x vale 0x0 y vale 0x3CD02700 int *x,y; x = &y + 3; ¿¿?? Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 29 Asignaciones en C Estructura genérica Lep-­‐Hand-­‐Side = Right-­‐Hand-­‐Side LHS debe contener un localización de memoria (AKA variable) RHS debe contener un valor. (Puede ser una dirección) Ejemplo 2 x vale 0x0 y vale 0x3CD02700 int *x,y; x = &y + 3; &y = 0x0018 3 => 3*4 = 0x0C x = 0x000024 Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 30 Asignaciones en C Estructura genérica Lep-­‐Hand-­‐Side = Right-­‐Hand-­‐Side LHS debe contener un localización de memoria (AKA variable) RHS debe contener un valor. (Puede ser una dirección) Ejemplo 3 x vale 0x0 y vale 0x3CD02700 int *x,y; x = &y + 3; *x = y; ¿¿?? Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 31 Asignaciones en C Estructura genérica Lep-­‐Hand-­‐Side = Right-­‐Hand-­‐Side LHS debe contener un localización de memoria (AKA variable) RHS debe contener un valor. (Puede ser una dirección) Ejemplo 3 x vale 0x0 y vale 0x3CD02700 int *x,y; x = &y + 3; *x = y; copie el valor de y a la dirección que apunta x. Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 32 Asignaciones en C Estructura genérica Lep-­‐Hand-­‐Side = Right-­‐Hand-­‐Side LHS debe contener un localización de memoria (AKA variable) RHS debe contener un valor. (Puede ser una dirección) Ejemplo 3 x vale 0x0 y vale 0x3CD02700 int *x,y; x = &y + 3; *x = y; copie el valor de y a la dirección que apunta x. Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 33 Arreglos en C Representan localizaciones de memoria adyacentes que almacenan el mismo =po de dato. int arreglo[128] ¿Cuántos bytes adyacentes =ene asignado la estructura arreglo? Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 34 Arreglos en C Representan localizaciones de memoria adyacentes que almacenan el mismo =po de dato. int arreglo[128] Entonces: a) b) Esta declaración asigna 512 bytes adyacentes en memoria. Supongamos que arreglo está en la dirección 0x00FF0000 int* p_arreglo; p_arreglo = arreglo; c) p_arreglo = &arreglo[0]; d) p_arreglo p_arreglo = &arreglo[3]; = &arreglo[0] + 3; ¿p_arreglo? &arreglo[i] es equivalente a (arreglo + i), &arreglo[0] + i*sizeof(arreglo[0]); Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 35 Arreglos en C Representan localizaciones de memoria adyacentes que almacenan el mismo =po de dato. int arreglo[128] Entonces: a) b) Esta declaración asigna 512 bytes adyacentes en memoria. Supongamos que arreglo está en la dirección 0x00FF0000 int* p_arreglo; p_arreglo = arreglo; c) p_arreglo = &arreglo[0]; d) p_arreglo p_arreglo = &arreglo[3]; = &arreglo[0] + 3; ¿p_arreglo? &arreglo[i] es equivalente a (arreglo + i), &arreglo[0] + i*sizeof(arreglo[0]); Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 36 Examinando Representaciones de Datos Cualquier =po de dato puede ser tratado como un arreglo de bytes, casteándolo a char. void show_bytes(char *start, int len) { int i; for (i = 0; i < len; i++) printf("%p\t0x%.2x\n", start+i, *(start+i)); printf("\n"); } void show_int (int x) { show_bytes( (char *) &x, sizeof(int)); } int a = 0x3039; printf("int a = %d;\n”,a); show_int(a); Arquitectura de Computadores – Ingeniería Civil Informática informatica.uv.cl 37