Segmentación de memoria
.stack, .heap, .data, .bss
Lenguajes de programación
Ingeniería en Computación e Informática
Semestre 2019-1
Contenidos
- ¿Como es la segmentación de memoria de un programa en C
- Cuál es la función de cada segmento de memoria
- Ejemplo práctico
- Ejercicios
Segmentación de memoria
.text [code segment]
-
Es de tamaño fijo y de solo lectura.
-
Almacenamiento todas las instrucciones en código máquina del programa en ejecución.
.data [data segment]
- Almacenamiento de las variables globales inicializadas del programa.
-
El segmento es de tamaño fijo y permite la escritura.
.bss [bss segment]
- Almacenamiento de las variables globales sin inicializar.
- El segmente es de tamaño fijo
- El segmento permite la escritura.
.Heap [heap segment]
- Segmento de memoria reservado para la memoria dinámica del programa.
- El tamaño de este segmento no está predefinido, varía en función de la asignación dinámica.
- Crece hacia a arriba (stack), en el mismo sentido que las direcciones de memoria.
- Para reservar memoria utilizamos en malloc(), calloc(), o realloc() del lenguaje C.
.Stack [stack segment]
- Almacenamiento de los argumentos pasados al programa
- Almacenamiento de argumentos pasados a las funciones
- Almacenamiento de las variables locales sin inicializar
- Almacenamiento de valores de retorno de las funciones
(dirección a la que tendrá que retornar el hilo de ejecución cuando termine la función)
Stack frame
- Stack Frame anterior: Lo que serían los otros stack frames de otras funciones almacenadas en la pila.
- Argumentos: Aquí se almacenan los argumentos que se le pasan a las funciones.
- Dirección de retorno [EIP o RET]: Aquí se almacena la dirección de memoria de retorno. La dirección de memoria que apunta a la siguiente instrucción por la que debe continuar el flujo del programa una vez finalizada la función.
- Dirección de marco de pila anterior [EBP]: Dirección de memoria que apunta al marco de pila anterior. Aquí se guarda la dirección de memoria a la que apuntaba anteriormente el registro EBP.
- Espacio reservado para variables locales: Aquí se reserva el espacio para almacenar las variables locales de la función.
.text [code segment]
-
Es de tamaño fijo y de solo lectura.
-
Almacenamiento todas las instrucciones en código máquina del programa en ejecución.
Ejemplo
#include <stdio.h>
int i;
int a = 5;
int main(int argc, char **argv) {
printf("Hola munfo\n");
printf("Cadena 2\n");
printf("Cadena 3\n");
return 0;
}
Ejercicios
#include <stdio.h>
int main(void)
{
return 0;
}
Probar utilizando el comando size el siguiente programa
Ejercicios
#include <stdio.h>
int global; /* Uninitialized variable stored in bss*/
int main(void)
{
return 0;
}
Probar utilizando el comando size el siguiente programa
Ejercicios
#include <stdio.h>
int global; /* Uninitialized variable stored in bss*/
int main(void)
{
static int i; /* Uninitialized static variable stored in bss */
return 0;
}
Probar utilizando el comando size el siguiente programa
Ejercicios
#include <stdio.h>
int global; /* Uninitialized variable stored in bss*/
int main(void)
{
static int i = 100; /* Initialized static variable stored in DS*/
return 0;
}
Probar utilizando el comando size el siguiente programa
Ejercicios
#include <stdio.h>
int global = 10; /* initialized global variable stored in DS*/
int main(void)
{
static int i = 100; /* Initialized static variable stored in DS*/
return 0;
}
Probar utilizando el comando size el siguiente programa
Ejercicios
#include <stdio.h>
#include <stdlib.h>
void foo(int valor) {
unsigned char c;
unsigned char *ptr = malloc(1);
printf("Stack: %p | Heap: %p\n", &c, ptr);
if(valor <= 0) return;
foo(valor - 1);
}
int main(){
foo(10);
return 0;
}
Probar el siguiente programa
¿Qué puede concluir?
Ejercicios
Escriba un programa que reciba argumentos en main e imprima sus direcciones de memoria. Luego realice un size al binario compilado para ver el uso del stack segement.
¿Qué puede concluir?
LDP 2019 / Segmentación de memoria enC
By Miguel Cantillana
LDP 2019 / Segmentación de memoria enC
Laboratorio 4
- 809