Justificativa para fazer com que o segmento de texto do espaço do usuário comece em 0x8048000

Justificativa para fazer com que o segmento de texto do espaço do usuário comece em 0x8048000

Li em algum lugar que (pelo menos desde o Linux v. 2.6) todo o código do espaço do usuário é colocado no endereço de carregamento 0x8048000 no espaço de endereço da memória virtual.

Minhas próprias observações confirmam isso. Eu fiz um

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

para vários processos e a primeira seção de um programa de processo textsempre começa em '0x8048000'.

Além disso, o código de inicialização da biblioteca C e todos os outros recursos de tempo de execução parecem estar mapeados após esse valor padrão.

Isso constitui quase 128 M de espaço de endereço, não muito, considerando que 0xC0000000 - 0x8048000 ainda é quase 3G de espaço de endereço para espaço do usuário.

Então minha pergunta é por quê?

Estamos lidando com endereços virtuais, a interferência ou sobreposição com outros programas está excluída pela definição da forma como o VM funciona.

Existem alguns mapeamentos fixos/padrão no intervalo 0x00000000 a 0x8048000?

Além do fato de o endereço inicial padrão estar no limite de uma página, qual é a razão para ter escolhido esse número em vez de qualquer outro valor?

Responder1

Admito que o seguinte não é uma boa resposta, mas acredito que o valor 0x8048000 está consagrado noEspecificação ELF. Ver figuras A.4, A.5 e A.6 nesse documento. OSuplemento de arquitetura System V ABI Intel 386também padroniza em 0x8048000. Consulte a página 3-22, Figura 3-25. 0x804800 é prescrito como endereço de segmento de texto baixo/endereço de pilha alta. E isso é estranho por si só, já que as pilhas geralmente são definidas nos endereços mais altos do espaço de memória de um processo, e o Linux não é exceção.

Você pode fazer com que o vinculador GNU ldconfigure um executável ELF para que o kernel o mapeie para um endereço um pouco inferior ou superior. O método para fazer isso varia de versão para versão do GCC e ld, portanto leia as páginas de manual com atenção. Isso tenderia a indicar que 0x8048000 não deriva de algum requisito de hardware, mas sim de outras considerações.

informação relacionada