Visión general Escuela de Ingeniería Civil en Informática Universidad de Valparaíso, Chile http:// 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); Auto a = new Auto(); a.setkilometraje(100); a.setlitros_bencina(17); float kph = a.getkph(); Lenguaje assembler Lenguaje máquina getmpg: pushq %rbp movq %rsp, %rsp... popq %rpb ret 01010101010110001010... 010101010100010111010 Sistema opera=vo Sistema Computacional 2
Visión general Código Fuente.c Código Fuente.c Código Fuente.c Compilador Bibliotecas.h Bibliotecas.h Bibliotecas.h Código Assembler.s Código Assembler.s Código Assembler.s Ensamblador Código Objetvo.o Código Objetvo.o Código Objetvo.o Linker (enlazador) Librerías del sistema Ejecutable 3
Hardware: Modelo lógico CPU Memoria Disco Duro Teclado Monitor USB Controladores de HW 4
Hardware: Modelo lógico 5
Hardware: Vista Física 6
Ejecución/desempeño de programas Banco de Registros Registros R1 R2 Rn Caché Interna 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 7
Memoria, Datos y direccionamiento Representación de la información 8
Codificación Binario Ejemplo: 00101011 2 =32+8+2+1=43 10 Hexadecimal Dígitos: 0 al F Cada dígito hexadecimal son 4 dígitos binarios Ejemplo: FA1D38E 16 Ejemplo: 0xFA1D38E 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= 2 32 Máquinas de palabras de 64 bits #registros= 2 64 Por compa=bilidad, los procesadores actuales soportan dis=ntos tamaños de palabra, siempre de la forma 2 n. 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. 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) 12
Memoria, Datos y direccionamiento Organización y direccionamiento de datos en memoria 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 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 15
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 El puntero al puntero de la dirección 0x004 se almacena en la dirección 0x0024 16
Direcciones y punteros Dirección: Localización en memoria Puntero: 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? 17
Direcciones y punteros Tamaño de los =pos de datos (bytes) 18
Orden de los bytes Qué dato está almacenado en la dirección 0x004? 0x0000015F 0x5F010000 Dos convenciones Big Endian Lille Endian 19
Orden de los bytes Big Endian Byte más significa=vos en las direcciones más bajas (PowerPC, sun, Internet) Lille Endian Ejemplo Byte más significa=vos en las direcciones más altas (intel) Variable de 4 Bytes: 0x01234567 La dirección es 0x100. 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); } 21
Orden de los bytes Ejemplo Complemento 2 22
Manipulación de datos en memoria Escuela de Ingeniería Civil en Informática Universidad de Valparaíso, Chile http:// 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. 24
Direcciones y punteros en C Aclaraciones *pa : es el valor en la dirección de memoria dada por el valor de pa &: dirección de un valor * : valor en una dirección Ejemplos: int x,y; int *pa; x=100; pa = &x; y = *pa + 1 cuánto vale y? A qué es equivalente *(&x)? pa = pa +1; Si ptr = 0x500, cuánto vale pa=pa+1? 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 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 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 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;?? 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 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;?? 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. 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. 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? 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; p_arreglo = &arreglo[0]; c) d) p_arreglo? &arreglo[i] es equivalente a (arreglo + i), p_arreglo = &arreglo[3]; p_arreglo = &arreglo[0] + 3; &arreglo[0] + i*sizeof(arreglo[0]); 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; p_arreglo = &arreglo[0]; c) d) p_arreglo? &arreglo[i] es equivalente a (arreglo + i), p_arreglo = &arreglo[3]; p_arreglo = &arreglo[0] + 3; &arreglo[0] + i*sizeof(arreglo[0]); 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); 37