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