GNU/Linux >> Tutoriales Linux >  >> Linux

Disposición de la memoria del programa en Linux

si tengo una matriz asignada en la pila, ¿un puntero al primer elemento también tendrá un valor más bajo que un puntero al segundo elemento?

No es importante "cómo" asigna la matriz, puede aumentar o disminuir el puntero de la pila, pero como resultado tiene espacio de direcciones reservado para la matriz.

Puede trabajar con ellos de forma normal, ya que la dirección más baja está reservada para el elemento 0.

entonces mi pregunta es ¿cuál es el diseño de memoria correcto para un proceso en Linux?

Puedes comprobarlo tú mismo. Inserte en algún lugar de su programa algo como std::cin.get() para pausar su programa.

Luego ejecute en un shell separado:

ps aux | grep your_program_name
cat /proc/<pid show by grep>/maps 

Esto imprime las asignaciones de memoria de su proceso, donde puede ver dónde se colocan el montón, la pila y otras cosas en la memoria.

Acerca de la pila:supongamos que tiene una máquina ordinaria con Linux y CPU Intel o AMD de 64 bits. Luego escribe el siguiente código:

extern void f(int);

void g(int param)
{
    f(param);
}

compilarlo y desensamblarlo:

g++ -ggdb -c test_my_stack.cc  && objdump -S test_my_stack.o

puede ver (se eliminaron los detalles sin importancia):

 void g(int param)
 {
 0:   55                      push   %rbp
 1:   48 89 e5                mov    %rsp,%rbp
 4:   48 83 ec 10             sub    $0x10,%rsp
 8:   89 7d fc                mov    %edi,-0x4(%rbp)
    f(param);
 b:   8b 45 fc                mov    -0x4(%rbp),%eax

como puedes ver en sub $0x10,%rsp reservamos espacio en la pila disminuyendo (moviendo hacia abajo) el puntero de la pila.


Lo primero que me molestó con esa imagen es que si el montón creció de mayor a menor, si asigné una matriz en el montón, ¿no debería un puntero al segundo elemento ser más pequeño en valor int que un puntero al primer elemento? lo cual sería confuso

De nada. Supongamos que asigna una matriz de 10 bytes de un grupo de memoria que crece de mayor a menor. Todo lo que el asignador tendría que hacer es disminuir el "fondo" de ese grupo de memoria en 10, luego usar ese valor como el comienzo de la matriz asignada. La matriz luego terminaría en el "fondo" anterior. La aritmética de punteros seguiría funcionando como se esperaba, pero "crecería" hacia una dirección baja.


Linux
  1. Uso de memoria de Linux

  2. Cómo borrar la caché de memoria en Linux

  3. ¿Medir el uso de RAM de un programa?

  4. Asesino de falta de memoria de Linux

  5. ¿Cómo ver el diseño de memoria de mi programa en C durante el tiempo de ejecución?

5 consejos para dominar Linux

Comando libre en Linux

Cómo borrar la memoria de intercambio en Linux

Procesos de Linux:diseño de memoria, salida y funciones C _exit

Ejemplos de comandos gratuitos en Linux

Segmentación de memoria de Linux