Perguntas sobre o layout do endereço virtual do kernel

0

Eu tenho duas perguntas sobre o layout de endereço virtual do kernel no sistema x86 e x64.

Até onde eu sei, o x86 usa o layout de memória dividida que é highmem e lowmem.

Se meu entendimento estiver correto, a única diferença entre highmem e lowmem é se ele tem mapeamento de endereço virtual para físico de 1: 1 ou não.

Além disso, parece que o lowmem contém código e dados acessados com freqüência pelo programa kernel e o highmem contém as tabelas de páginas ou dados do programa de nível de usuário que não são acessados com freqüência.

No entanto, não consigo entender o motivo pelo qual o kernel x86 divide os espaços de endereço virtual e localiza os dados e o código acessados com freqüência para o lowmem. Qual é a vantagem disso? Parece que, independentemente da localização da memória do kernel, a execução da tabela de páginas deve ser chamada para obter mapeamentos virtuais para físicos. Se estiver correto, parece que não há vantagem do highmem e lowmem.

Aqui, minha primeira pergunta é, se o lowmem usa os mapeamentos 1: 1 (por exemplo, endereço físico + constante (0x80000000) = > endereço virtual do kernel), por que a MMU gasta seu clock para percorrer a tabela de páginas para conhecer o virtual para mapeamentos físicos. Se possível, podemos modificar a lógica da MMU para torná-la apenas menos constante mágica a partir do endereço virtual para obter um endereço físico, se ele estiver localizado na região de lowmem. ou existem outras razões para localizar dados e códigos acessados com freqüência no lowmem? E por que apenas o lowmem usa os mapeamentos 1: 1 ...?

Minha segunda pergunta é "o mecanismo de divisão de memória lowmem e highmem também é implementado no sistema x64 linux?"

Obrigado antecipadamente

    
por JaeHyuk Lee 07.04.2017 / 17:32

1 resposta

1

Highmem e lowmem estão relacionados à extensão de endereço físico em processadores x86. Esse mecanismo permite ao processador endereçar 64 GB de memória, em vez dos tradicionais 4 GB. No entanto, como o conjunto de instruções não é alterado e os registros e ponteiros ainda têm 32 bits, o espaço de endereço virtual ainda é limitado a 4 GB. As instruções da máquina sempre usam endereços virtuais, não endereços físicos.

A conseqüência disso é que "highmem" não pode ser endereçado diretamente até que seja mapeado na região endereçável. É por isso que apenas o lowmem usa o mapeamento 1: 1; mapeamento para highmem não é possível.

Sua próxima pergunta foi: por que a lógica da MMU não pode ser simplificada para ignorar as tabelas de páginas e fazer uma subtração simples para obter o endereço físico? A MMU é implementada em hardware e é projetada para usar tabelas de páginas (e o TLB) para fazer seu trabalho. Existem páginas "enormes", que saltam um nível nas tabelas de páginas, fazendo com que o tamanho da página seja 4MB em vez de 4kB no x86.

Sua última pergunta: a divisão de memória em lowmem e highmem também está na arquitetura x64? Não. O mecanismo PAE é um pouco complicado para prolongar a vida útil do x86. O x64 com seus espaços de endereço muito maiores (físicos e virtuais) não precisa dele.

    
por 07.04.2017 / 20:16