Perguntas sobre o layout do endereço virtual do kernel

Perguntas sobre o layout do endereço virtual do kernel

Tenho duas perguntas sobre o layout de endereço virtual do kernel em sistemas x86 e x64.

Pelo que 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 possui mapeamento de endereço virtual para físico 1:1 ou não.

Além disso, parece que lowmem contém código e dados frequentemente acessados ​​pelo programa do kernel e highmem contém tabelas de páginas ou dados de programas em nível de usuário que não são acessados ​​com frequê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 códigos acessados ​​com frequência em lowmem. Qual é a vantagem disso? Parece que, independentemente da localização da memória do kernel, a caminhada na tabela de páginas deve ser invocada para obter mapeamentos virtuais para físicos. Se estiver correto, parece que não há vantagem no highmem e no lowmem.

Aqui, minha primeira pergunta é: se o lowmem usa os mapeamentos 1:1 (ou seja, endereço físico + constante (0x80000000) => endereço virtual do kernel), por que o MMU gasta seu relógio para percorrer a tabela de páginas para conhecer os mapeamentos virtuais para físicos. Se possível, podemos modificar a lógica MMU para torná-la apenas menos a constante mágica do endereço virtual para obter um endereço físico se estiver localizado na região de baixa memória. ou há algum outro motivo para localizar dados e códigos acessados ​​com frequê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 é implantado no sistema Linux x64?"

desde já, obrigado

Responder1

Altoebaixo memóriaestão relacionados à extensão de endereço físico em processadores x86. Este mecanismo permite que o processador enderece 64 GB de memória, em vez dos 4 GB convencionais. No entanto, como o conjunto de instruções permanece inalterado e os registradores e ponteiros ainda têm 32 bits, o espaço de endereço virtual ainda está limitado a 4 GB. As instruções de máquina sempre usam endereços virtuais, não endereços físicos.

A consequência disto é 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; o mapeamento para highmem não é possível.

Sua próxima pergunta foi: por que a lógica do MMU não pode ser simplificada para pular tabelas de páginas e fazer uma subtração simples para obter o endereço físico? O MMU é implementado em hardware e projetado para usar tabelas de páginas (e o TLB) para realizar seu trabalho. Porém, existem páginas "enormes", que pulam um nível nas tabelas de páginas, tornando o tamanho da página 4 MB em vez de 4 KB no x86.

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

informação relacionada