Cuando se inicia un proceso, obtiene su propio espacio de direcciones virtuales. El tamaño del espacio de direcciones virtuales depende de su sistema operativo. En general, los procesos de 32 bits obtienen 4 direcciones GiB (4 giga binarias) y los procesos de 64 bits obtienen 18 direcciones Eib (18 exa binarias).
No puede acceder de ninguna manera a nada que no esté mapeado en su espacio de direcciones virtuales ya que, por definición, todo lo que no esté mapeado no tiene una dirección para usted. Puede intentar acceder a las áreas de su espacio de direcciones virtuales que actualmente no están asignadas a nada, en cuyo caso obtendrá una excepción segfault.
No todo el espacio de direcciones está asignado a algo en un momento dado. Además, no todo el mapa puede correlacionarse (la cantidad de mapeo depende del procesador y del sistema operativo). En la generación actual de procesadores Intel, se pueden mapear hasta 256 TiB de su espacio de direcciones. Tenga en cuenta que los sistemas operativos pueden limitarlo aún más. Por ejemplo, para procesos de 32 bits (que tienen hasta 4 direcciones GiB) Windows por defecto reserva 2 GiB para el sistema y 2 GiB para la aplicación (pero hay una manera de hacerlo 1 GiB para el sistema y 3 GiB para la aplicación).
La cantidad de espacio de direcciones que se usa y la cantidad asignada cambia mientras se ejecuta la aplicación. Las herramientas específicas del sistema operativo le permitirán monitorear lo que la memoria asignada actualmente y el espacio de direcciones virtuales es para una aplicación que se está ejecutando.
Sección de código, sección de datos, BSS, etc. son términos que hacen referencia a diferentes áreas del archivo ejecutable creado por el vinculador. En general, el código está separado de los datos estáticos inmutables que están separados de los datos asignados estáticamente pero mutables. La pila y el montón están separados de todos los anteriores. Su tamaño es calculado por el compilador y el enlazador. Tenga en cuenta que cada archivo binario tiene sus propias secciones, por lo que las bibliotecas vinculadas dinámicamente se correlacionarán en el espacio de direcciones por separado, cada una con sus propias secciones asignadas en algún lugar. El montón y la pila, sin embargo, no son parte de la imagen binaria, generalmente hay solo una pila por proceso y un montón.
El tamaño de la pila (al menos la pila inicial) generalmente es fijo. Los compiladores y/o vinculadores generalmente tienen algunos indicadores que puede usar para establecer el tamaño de la pila que desea en tiempo de ejecución. Las pilas generalmente "crecen hacia atrás" porque así es como funcionan las instrucciones de la pila de procesadores. Si las pilas crecen en una dirección y el resto crece en la otra, es más fácil organizar la memoria en situaciones en las que desea que ambas sean ilimitadas, pero no se sabe cuánto puede crecer cada una.
El montón, en general, se refiere a todo lo que no está preasignado cuando se inicia el proceso. En el nivel más bajo hay varias operaciones lógicas relacionadas con la gestión de heap (no todas se implementan como describo aquí en todos los sistemas operativos).
Si bien el espacio de direcciones es fijo, algunos sistemas operativos realizan un seguimiento de las partes que el proceso recupera actualmente. Incluso si este no es el caso, el proceso en sí necesita hacer un seguimiento de ello. Por lo tanto, la operación de nivel más bajo es realmente decidir que se usará una cierta región del espacio de direcciones.
La segunda operación de bajo nivel es instruir al sistema operativo para asignar esa región a algo.Esto, en general, puede ser
parte de la memoria que no es intercambiable en
memoria que es intercambiable y se asigna al archivo de intercambio del sistema
memoria que es intercambiable y se asigna a algún otro archivo
memoria que se puede cambiar y mapear a algún otro archivo en modo de solo lectura
la misma asignación que otra región de direcciones virtuales se asigna a
la misma asignación que otra región de direcciones virtuales se asigna a, pero en modo de sólo lectura
la misma asignación que otra región de direcciones virtuales se asigna a , pero en la copia en el modo de escritura con los datos copiados asignados al archivo de intercambio por defecto
puede haber otras combinaciones se me olvidó, pero esos son los principales.
Por supuesto, el espacio total utilizado realmente depende de cómo lo defina. La RAM que se usa actualmente es diferente al espacio de direcciones actualmente mapeado. Pero como escribí anteriormente, las herramientas que dependen del sistema operativo deberían permitirle descubrir lo que está sucediendo actualmente.
No es una pregunta de programación. – unwind