pode. "por muitos anos" isso não aconteceu; originalmente não havia razão para fazê-lo porque ninguém tinha tanta RAM.
você precisa continuar lendo um pouco mais, olhe com cuidado.
The limitation on how much memory can be directly mapped with logical addresses remains, however. Only the lowest portion of memory (up to 1 or 2 GB, depending on the hardware and the kernel configuration) has logical addresses;[2] the rest (high memory) does not. Before accessing a specific high-memory page, the kernel must set up an explicit virtual mapping to make that page available in the kernel's address space. Thus, many kernel data structures must be placed in low memory; high memory tends to be reserved for user-space process pages.
If the kernel is running in the context of a process (handling a syscall), the process' page tables will still be loaded, so why can't the kernel read usermode process memory directly?
faz
link
Também pode ser útil entender que o uso usual de kmalloc()
para alocar estruturas no kernel retorna a memória que está dentro do mapeamento direto de ~ 1GB. Então, isso é lindo e direto de se acessar.
(A desvantagem é que ela introduz complexidade na forma desses diferentes tipos de alocação.
Se você quisesse que as alocações kmalloc()
padrão usassem mais de 25% da RAM, estaria fazendo algo bastante exigente ... Em casos mais especializados, você pode definir o sinalizador GFP_HIGHMEM e mapear & desmapear a memória conforme necessário. Mas a resposta oficial é que você simplesmente não deveria tentar executar uma carga de trabalho tão exigente em sistemas legados de 32 bits recheados com mais de 30 bits de RAM física).
Se você está realmente interessado neste detalhe específico, notei duas outras coisas.
1. O limite de 1GB faz impor um limite na RAM, mas é um pouco maior.
link
A bit of googling indicates that the 4G:4G patch is needed for systems with a lot of RAM (eg. 32 GB or more) because the kernel memory tables scale with the size of physical memory and a 32 GB system uses 0.5 GB for the table, half the kernel space available to a 3G:1G system. A 64 GB system won't boot because all of kernel memory is needed for the table.
O patch 4G: 4G é outra coisa, mas você provavelmente pode ignorá-lo, não está no Linux principal.
Parece que essa limitação também foi superada, pois agora é possível ativar o CONFIG_HIGHMEM64G (em i386, ou seja, 32 bits). Provavelmente é melhor não confiar nisso. Ou pense muito sobre o que deve ser feito.
2. O mapeamento direto não é estritamente necessário para as tabelas de páginas.
Muitos tutoriais e explicações passo a passo para escrever um sistema operacional usam um truque alucinante chamado "tabelas de páginas recursivas".
link
O Linux não usou essa abordagem, então o Linux tradicional é mais simples de entender. O mapeamento direto da "baixa memória" de ~ 1GB é configurado na tabela de páginas inicial e nunca é alterado. E as tabelas de páginas são alocadas dentro de "pouca memória".
(Você está pensando sobre o que o CONFIG_HIGHMEM64G faz agora? Pare com isso, é ruim para você.)
Eu imagino que Linus simplesmente não pensou no truque recursivo. IIRC existem outras desvantagens de não ter um mapeamento direto bem dimensionado disponível também, mas não tenho certeza sobre exemplos específicos.
Eu digo "Linux tradicional". Não sei se o KPTI foi realmente fundido para 32 bits ainda ... mas, de qualquer forma, o KPTI não deve mudar a ideia geral. Depois de alternar do usuário para as tabelas de páginas do kernel, o kernel pode acessar o mapeamento direto. O processo de mudança é uma incrível magia negra, mas é simplesmente executada em cada mudança de contexto. As tabelas de páginas do espaço de usuário não incluem o mapeamento direto, mas o espaço do usuário não acessa e não deve acessar as tabelas de páginas, etc., então está tudo bem.