Se o espaço de endereço virtual puder ser maior que o espaço de endereço físico, como os mapeamentos de endereço são armazenados na memória?

14

Digamos que estamos trabalhando com um sistema que possui 40 bits de endereço físico. O espaço físico total do endereço (assumindo memória endereçável por byte) é bytes ou 1 TiB. E se os endereços virtuais tiverem 48 bits, isso significa que há mais endereços disponíveis na memória virtual do que os locais na memória física.240.

Isso faz sentido para mim, porque os endereços "em excesso" também podem se referir aos locais do disco rígido. No entanto, o que não entendo é como ocorre a tradução entre endereços virtuais e físicos. Suponho que exista um mapeamento armazenado em algum lugar que vincule os locais do VAS aos locais físicos. Se houver mais locais de endereços virtuais do que locais físicos, como todos esses mapeamentos podem ser armazenados na memória? No mínimo, você precisaria de 48 bits para armazenar cada endereço virtual e outros 40 para armazenar o local físico para o qual ele mapeia. Portanto, obviamente, você não pode simplesmente armazenar um mapeamento 1: 1 de cada endereço virtual em sua contraparte física, pois o mapeamento de cada local exigiria mais memória do que a própria memória física.

O que exatamente estou perdendo aqui?

Brad Power
fonte
Você não pode fazer isso mesmo com uma pequena quantidade de memória e espaço de endereço. Se você tivesse endereços físicos de 16 bits e endereços virtuais de 16 bits, ainda não conseguiria armazenar todos os mapeamentos 1: 1!
user253751
2
O problema é mais complexo do que você pensa. Os computadores raramente têm TB de memória; portanto, a memória física é MUITO menor que o espaço de endereço virtual. Pior ainda: cada processo possui um espaço de endereço virtual totalmente separado!
Mooing Duck
Além das localizações do disco rígido, você tem apenas bits / espaço de sobra para desperdiçar. Por exemplo, você pode ter uma região grande abaixo da pilha não mapeada para evitar estouros não detectados. Você pode randomizar o que carrega, impedindo outra classe de ataques . Deseja indicar um único bit se o endereço pertence ao kernel ou ao usuário - vá em frente mesmo que você esteja desperdiçando metade do espaço. Enquanto a maioria dos livros didáticos se concentra no aspecto de paginação da memória virtual, há muito mais.
Maciej Piechotka
(Observe também que os endereços podem ter um alias, o que às vezes é útil, portanto, VA A e endereço B se referem ao mesmo PA P, apesar de A! = B.)
Maciej Piechotka

Respostas:

26

O truque para fazer isso funcionar é "paginação". Ao trazer dados de um disco rígido para a memória física, você não apenas traz alguns bytes. Você traz uma página inteira. 4k bytes é um tamanho de página muito comum.

Se você só precisa acompanhar as páginas, e não cada byte individual, o mapeamento fica muito mais barato. Se você tiver um espaço de endereço de 48 bits e páginas de 4096 bytes, precisará rastrear qual das 2 ^ 36 páginas (aproximadamente 69 bilhões de páginas). Isso é muito mais fácil! O registro de onde todas as páginas são encontradas é conhecido como "tabela de páginas".

Se você realmente precisa de 1-256 TiB de memória, abrir alguns gigabytes para armazenar esta tabela de páginas não é grande coisa. Na prática, no entanto, faremos coisas como usar tabelas de páginas de vários níveis , o que nos permite ser um pouco mais eficientes, mantendo as páginas apenas para regiões do espaço de endereço que estamos realmente usando.

Cort Ammon - Restabelecer Monica
fonte
6
Um arquivo de paginação é um termo do Windows para um arquivo físico em disco que contém o conteúdo dos quadros de página físicos recuperados por falta de memória, cujo conteúdo precisa ser mantido. Se não me engano, a estrutura de dados que mapeia os endereços de páginas virtuais para endereços de páginas físicas deve ser chamada de tabela de páginas .
Reinstate Monica - ζ-- 4/17/17
@hexafraction Eu acho que você está certo. Eu fiz a mudança.
Cort Ammon - Restabelece Monica
2
Quando a memória real é grande, outra maneira de reduzir a memória necessária para as tabelas de páginas é permitir páginas maiores. O x86 tem uma opção para misturar 4 páginas KiB com 2/4 páginas MiB.
Node Eldredge