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 text
sempre 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 ld
configure 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.