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

5

Eu 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 ser 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 material de espaço do usuário.

Então, minha pergunta é por quê?

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

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

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

    
por darbehdar 25.06.2012 / 05:52

1 resposta

3

Admito que o seguinte não é uma ótima resposta, mas acredito que o valor 0x8048000 esteja consagrado na Especificação ELF . Veja as figuras A.4, A.5 e A.6 no doc. O Suplemento de Arquitetura System V ABI Intel 386 também padroniza em 0x8048000. Veja a página 3-22, Fig. 3-25. 0x804800 é prescrito como o 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 colocadas nos endereços altos do espaço de memória de um processo, e o Linux não é uma exceção.

Você pode obter o vinculador GNU ld para configurar um executável ELF para que o kernel mapeie-o para um endereço um pouco mais baixo ou um pouco mais alto. O método para fazer isso varia de versão para versão do GCC e ld, então leia as man pages cuidadosamente. Isso tenderia a indicar que 0x8048000 não deriva de algum requisito de hardware, mas de outras considerações.

    
por 25.06.2012 / 18:10