Espacio de direcciones virtual de proceso

Espacio de direcciones virtual de proceso

de Nicolas Estefan Vidal -
Número de respuestas: 1

Buenas tardes

Repasando el teórico de paginación y leyendo el libro me surgió la siguiente duda: ¿Cómo obtiene un proceso nuevo su espacio de direcciones virtuales? ¿La dirección virtual de la primera instrucción de un programa es siempre 0 (o algún otro número que dependa exclusivamente del programa y no de lo que le sea asignado por el sistema operativo)?

Indagando en internet no logré encontrar una explicación satisfactoria. Intenté observar el assembly generado por gcc al compilar un programa sencillo en C, y llegué a la conclusión de que el espacio de direcciones virtuales en el que se va a manejar el proceso, depende de los valores con los que vengan cargados los registros instruction pointer y stack pointer cuando el mismo es creado. A su vez, parecería que el espacio de direcciones virtuales no es siempre el mismo para un mismo programa. Imprimiendo la direccion de una variable en la terminal, obtengo resultados distintos con cada ejecución, y las direcciones obtenidas son bastante altas, lo cual supongo que tiene que ver con que el stack crece hacia abajo. Esto me lleva a otra pregunta; ¿Es necesario restar un offset (posiblemente dado por el sistema operativo cuando se crea el proceso ¿?) a una direccion virtual, previo a intentar buscar el frame correspondiente a su página en la page table?



Espero su respuesta, muchas gracias.

En respuesta a Nicolas Estefan Vidal

Re: Espacio de direcciones virtual de proceso

de Jorge Merlino -
Los programas normalmente no tienen direcciones virtuales hard-coded en el assembler. En el espacio virtual de un proceso hay muchas mas cosas que solo el código del proceso por lo que en general no sabés donde va a quedar el código. Más aún, es un riesgo de seguridad que las direcciones virtuales sean siempre iguales por lo que el sistema operativo intencionalmente guarda los procesos siempre en lugares distintos (buscá ASLR en internet)
Si querés ver el mapa de memoria virtual de un proceso podés ejecutar: pmap ${pid}
Saber donde empieza la página a la que pertenece una dirección en general es fácil porque tienen tamaño potencia de dos y es solo poner en 0 los últimos bits.

Saludos