C: Diseño de memoria de ejecución de progtwig en C

Quería saber cómo el kernel está proporcionando memoria para el progtwig C simple.

Por ejemplo :

#include #include int my_global = 10 ; main() { char *str ; static int val ; str = ( char *) malloc ( 100 ) ; scanf ( "%s" , str ) ; printf( " val:%s\n",str ) ; free(str) ; return 1 ; } 

Mira, en este progtwig he usado estática, global y malloc para asignar memoria dinámica. Entonces, ¿cómo será la distribución de memoria …? Cualquiera que me dé la url, tendrá información detallada sobre este proceso.

Básicamente, en los progtwigs de C creados para apuntar a ELF (formato ejecutable y enlazable) como los creados en linux, se crea un diseño de memoria estándar. Probablemente existen diseños similares para otras architectures, pero no sé lo suficiente como para contarles más sobre ellas.

El diseño:

Hay algunas secciones de datos globales que se inicializan en las direcciones de memoria baja en la memoria (como las secciones para el código que se ejecuta actualmente, los datos globales y las cadenas que se crean con "..." dentro de su código C).

Debajo de eso hay un montón de memoria abierta que se puede utilizar. El tamaño de este montón aumenta automáticamente a medida que las llamadas a malloc y mueven libremente lo que se denomina “interrupción del progtwig” a direcciones más altas en la memoria.

Comenzando en una dirección alta en la memoria, la stack crece hacia direcciones más bajas. La stack contiene memoria para cualquier variable asignada localmente, como las que se encuentran en la parte superior de las funciones o dentro de un ámbito ( { ... } ).

Más información:

Hay una buena descripción de un progtwig ELF en ejecución aquí y más detalles sobre el formato en sí en el artículo de Wikipedia . Si desea ver un ejemplo de cómo un comstackdor se encarga de traducir el código C al ensamblaje, puede consultar a GCC, su Manual de Internos tiene algunas cosas interesantes; las secciones más relevantes son probablemente las del capítulo 17, especialmente 17.10, 17.19 y 17.21. Finalmente, Intel tiene mucha información sobre el diseño de la memoria en su Manual del desarrollador de software de architectures IA-32 . Describe cómo los procesadores Intel manejan la segmentación de la memoria y la creación de stacks y similares. No hay detalles sobre ELF, pero es posible ver dónde coinciden los dos. Los bits más útiles probablemente son la sección 3.3 del Volumen 1: Arquitectura básica, y el capítulo 3 del Volumen 3A: Guía de progtwigción del sistema, Parte 1.

Espero que esto ayude a cualquiera que se sumerja en los aspectos internos de ejecutar progtwigs de C, buena suerte.

Hay una breve discusión en wikipedia .

Una introducción un poco más larga está aquí .

Más detalles disponibles aquí , pero no estoy seguro de que se presente muy bien.

Todas las variables estáticas y globales se almacenan en el segmento de datos, todas las variables automáticas y temporales se almacenan en la stack y todas las variables dinámicas se almacenan en el montón.

Todos los parámetros de función se almacenan en la stack y hay un marco de stack diferente para cada llamada de función. Así es como funciona la función de recursión.

Para más sobre esto, vea este sitio .

En palabras prácticas, cuando ejecuta cualquier progtwig C, su imagen ejecutable se carga en la RAM de la computadora de manera organizada, lo que se denomina espacio de direcciones de proceso o diseño de memoria del progtwig C.

http://www.firmcodes.com/memory-layout-c-program-2/

  • todas las variables no inicializadas estáticas y globales van a bss (Bloque iniciado por Símbolo).
  • todas las variables GLobal / Local / static inicializadas se dividen adicionalmente como

solo lectura

const int x = 10;

& leer escribir

char Str [] = “StackOverFlow”

  • El segmento de la stack es el área donde se almacenan las variables locales. Al decir variable local significa que todas las variables que se declaran en cada función, incluyendo main () en su progtwig de C.

  • El segmento de texto contiene instrucciones ejecutables de su progtwig C, también llamado segmento de código. Esta es la representación en lenguaje de máquina de los pasos del progtwig a realizar, incluidas todas las funciones que componen el progtwig, tanto el definido por el usuario como el sistema. El segmento de texto se puede compartir de modo que solo una copia debe estar en la memoria para diferentes progtwigs en ejecución, como editores de texto, shells, etc. Generalmente, el segmento de texto es de solo lectura, para evitar que un progtwig modifique accidentalmente sus instrucciones.

  • Una región más en el diseño de la memoria de un progtwig es Unmapped o segmento reservado que contiene argumentos de línea de comando y otros datos relacionados con el progtwig, como una dirección más baja, una dirección más alta de la imagen ejecutable, etc.