Justificación para hacer que el segmento de texto del espacio de usuario comience en 0x8048000

Justificación para hacer que el segmento de texto del espacio de usuario comience en 0x8048000

Leí en alguna parte que (al menos desde Linux v. 2.6) todo el código del espacio de usuario se coloca en la dirección de carga 0x8048000 en el espacio de direcciones de la memoria virtual.

Mis propias observaciones lo confirman. he hecho un

cat /proc/......../maps

para varios procesos y la primera sección del programa de un proceso textsiempre comienza en '0x8048000'.

Además, el código de inicio de la biblioteca C y todos los demás beneficios del tiempo de ejecución parecen estar asignados después de este valor predeterminado.

Esto constituye casi 128 M de espacio de direcciones, no mucho considerando que 0xC0000000 - 0x8048000 sigue siendo casi 3G de espacio de direcciones para el espacio de usuario.

¿Mi pregunta es, porque?

Se trata de direcciones virtuales, por definición del funcionamiento de VM se excluye la interferencia o superposición con otros programas.

¿Existen algunas asignaciones fijas/predeterminadas en el rango 0x00000000 a 0x8048000?

Aparte del hecho de que la dirección de inicio predeterminada se encuentra en el límite de una página, ¿cuál es la razón para haber elegido este número en lugar de cualquier otro valor?

Respuesta1

Admito que lo siguiente no es una gran respuesta, pero creo que el valor 0x8048000 está consagrado en elEspecificación ELF. Ver figuras A.4, A.5 y A.6 en ese doc. ElSuplemento de arquitectura System V ABI Intel 386también estandariza en 0x8048000. Consulte la página 3-22, Figura 3-25. 0x804800 se prescribe como dirección de segmento de texto bajo/dirección de pila alta. Y eso es extraño en sí mismo, ya que las pilas generalmente se configuran en las direcciones altas del espacio de memoria de un proceso, y Linux no es una excepción.

Puede hacer que el vinculador GNU ldconfigure un ejecutable ELF para que el kernel lo asigne a una dirección algo inferior o algo superior. El método para hacer esto varía de una versión a otra de GCC y ld, así que lea atentamente las páginas del manual. Esto tendería a indicar que 0x8048000 no se deriva de algún requisito de hardware, sino de otras consideraciones.

información relacionada