Por que os dados e segmentos de código se sobrepõem completamente no Linux?

4

Contexto: estou lendo "Entendendo o kernel do Linux, ed 3d", que usa o kernel 2.6.11.

Pergunta: Pelo que entendi, o endereço físico é obtido traduzindo o endereço linear, que é obtido traduzindo o endereço lógico. O endereço lógico consiste em um seletor de segmento, que identifica um segmento em uma tabela de descrição

A Tabela de Descrição Global do Linux inclui, entre outros segmentos, um código de usuário e um segmento de dados. Mas o endereço base de ambos os segmentos é 0x0 e seu tamanho também é o mesmo. Então eles se sobrepõem completamente. Então, como eu entendo, o endereço lógico cs + offset é idêntico ao endereço lógico ds + offset , onde cs e ds são os registradores da CPU que armazenam respectivamente o seletor de segmento de código e o seletor de segmento de dados. Eu acho que este é o caso porque ambos os segmentos têm o mesmo endereço base, que é incrementado com o offset para obter o endereço linear.

Se este for o caso, e ambos mapearem para o mesmo endereço linear, eles também não mapeiam para o mesmo endereço físico? Se sim, qual é a utilidade de ter registros cs e ds separados?

    
por codd 16.01.2014 / 17:52

1 resposta

4

Os registradores de segmentação são um legado dos primeiros dias dos processadores x86, quando o offset não era grande o suficiente para endereçar toda a memória que o processador poderia endereçar. O 8086 original tinha um espaço de endereçamento de 20 bits, mas só podia usar um deslocamento de 16 bits. Você tinha que usar os registradores de segmento para especificar quais 64 KB do espaço de endereço de 1024 KB desejado. Os registradores de segmento eram efetivamente registradores de 20 bits onde os 4 bits mais baixos eram forçados a 0. Carregando um registrador de segmento configurava os 16 bits superiores do registrador. Isso permitiu que segment + offset cobrisse todo o espaço de endereço de 20 bits.

Os registros de segmento ainda existem, mas o Linux os define como 0, de modo que pode fingir que não. Os modernos processadores x86 (ou seja, o 80386 e mais recentes) podem usar um deslocamento grande o suficiente para cobrir todo o espaço de endereçamento, tornando a segmentação de memória uma complicação que não é mais necessária. Leia segmentação de memória x86 e o modelo de memória plana para mais detalhes.

    
por 16.01.2014 / 18:23