Memória Virtual e MMU: quando são usadas e quando não?

3

Eu estou querendo saber como um sistema de memória virtual poderia ser gerenciado junto com uma MMU quando há a necessidade de manter alguns endereços "fixos" no espaço de endereço.

Por exemplo, quando uma máquina é inicializada, a CPU começa a ler a primeira instrução a partir de um endereço fixo (que é mapeado para algum tipo de ROM), então fornece endereços para pheriperals (se o sistema de E / S Mapeada de Memória for usado) ) e, em seguida, o sistema operacional é inicializado. Eu também sei que as rotinas de interrupção e essas coisas precisam estar na posição "fixa" na memória, e essas coisas são carregadas pelo sistema operacional.

Eu posso pensar que a MMU está desativada em tal processo e, em seguida, é ativada após o sistema operacional carregado.

Posso pensar que os processos acima usam o espaço de endereço do sistema e que o espaço de endereço do sistema não é virtualizado, apesar do espaço de endereço do usuário realmente ser.

Isso resultará em um pool de endereços físicos que permanece o mesmo para acessar periféricos de E / S, rotinas de interrupção e assim por diante, e um espaço de usuário virtual gerenciado pela MMU, onde os processos podem elaborar todos os dados precisa elaborar, exigindo ao sistema operacional o acesso a periféricos de E / S.

Mas eu não tenho certeza dessas coisas. Então eu pergunto, quando a MMU está realmente ativada? Ela lida com todos os endereços, ou apenas com os do espaço do usuário? É verdade que alguns endereços podem ignorar a MMU mesmo quando o sistema está em execução, a fim de acessar posições de memória fixas? Ou estou perdendo algumas pistas importantes?

    
por iMineLink 03.02.2014 / 15:45

2 respostas

-1
As CPUs do x86

inicializam em um "modo real" - basicamente, o modo de 16 bits em que a CPU só consegue ver os primeiros 1MB de RAM. Uma das primeiras tarefas de um carregador de inicialização de BIOS (ou UEFI pode fazer isso diretamente) é mudar a CPU para o modo "protegido". A memória protegida está disponível neste modo, e a CPU tem níveis de privilégio neste modo - geralmente "kernel" e "usuário".

Eu sou um pouco confuso sobre isso, mas como a MMU mapeia a memória é controlada pela Global Descriptor Table (GDT). O modo kernel pode alterar o GDT, o modo de usuário não pode.

Assim, quando o modo kernel é inserido, ele pode definir o GDT para um mapeamento de memória que mapeia toda a memória (ou seja, age como se não estivesse mapeado) ou a mapeia de forma a permitir acesso a todos os dispositivos, etc. Quando ele retorna ao modo de usuário, ele pode carregar um GDT mais restritivo antes de retornar o controle.

Eu posso estar errado - pode ser quando o processador entra no modo kernel ele simplesmente desativa o MMU, mas eu acredito que ele pode ser usado pelo modo kernel também desta maneira.

    
por 03.02.2014 / 16:42
1

Desculpe, mas a especulação na resposta escolhida é enganosa e deixa de fora o aspecto mais importante, que é a tradução de endereços por meio de tabelas de páginas.

É verdade que quando qualquer máquina compatível com PC inicializa, ela inicia em "modo real". E os sistemas operacionais modernos de 32 bits no x86 são executados no "modo protegido", que inclui o endereçamento segmentado, conforme definido pelo GDT. No entanto, eles também habilitam a tradução de endereços baseada na tabela de páginas configurando o bit PG (paginação), bit 31, no CR0. Isso nunca é desligado durante a vida útil do sistema operacional.

Além disso, na maioria dos sistemas operacionais modernos de 32 bits, o endereçamento segmentado baseado em GDT é essencialmente ignorado: Todos os GDTEs comumente usados são configurados com endereço base 0, tamanho 4 bilhões de bytes. Assim, embora a MMU passe pelos movimentos de adicionar o segmento relevante "endereço base" ao "deslocamento" que vem da instrução, isso é efetivamente um não operacional. Um conjunto diferente de GDTEs é usado para o anel 0 vs o anel 3, mas todos eles têm o mesmo endereço e tamanho base. Os campos "nível de privilégio" (0 vs 3) são sobre tudo o que é diferente. Isso permite que o bit de "acesso privilegiado" nas entradas da tabela de páginas seja efetivo, permitindo que a memória seja protegida para o modo kernel ou o acesso ao modo kernel + usuário, página por página. Isso não é possível com descritores de segmento; eles são muito grosseiros.

Em CPUs x64, o mecanismo de segmentação desaparece essencialmente no modo longo. A tradução de endereços baseada em tabelas de páginas, é claro, ainda acontece enquanto o bit PG é definido, o que acontece durante a vida útil do sistema operacional. A MMU é mais enfaticamente não desabilitada enquanto no modo kernel, nem o "SO" (ou qualquer coisa) usa mapeamento 1: 1 entre endereços virtuais e físicos.

Os acessos a endereços físicos conhecidos, como aqueles atribuídos a periféricos semelhantes a PCI, são feitos alocando endereços virtuais não utilizados e configurando as entradas correspondentes da tabela de páginas com os números de página física necessários. Código em drivers de dispositivo, em seguida, usa os endereços virtuais.

Sim, o DMA funciona principalmente em endereços físicos. Um controlador de DMA estúpido / barato na verdade apenas transfere para um buffer fisicamente contíguo com um determinado endereço inicial e comprimento. Para suportar tais dispositivos, o sistema operacional ou o driver de dispositivo alocará "buffers de retorno" fisicamente contíguos para o dispositivo DMA acessar e copiar dados entre eles e o buffer do usuário.

Controladores DMA inteligentes / mais caros podem manipular buffers que ocupam intervalos não contíguos de endereços físicos (referido como "mapeamento de dispersão-coleta"). Estes são muito preferidos para dispositivos de alto desempenho.

Um IOMMU pode permitir que controladores DMA estúpidos / baratos acessem um buffer fisicamente descontínuo como se fosse contíguo. No entanto, as plataformas com IOMMUs ainda não são onipresentes o suficiente para dizer "sua plataforma deve ter um IOMMU para o nosso sistema operacional". Portanto, no momento, as IOMMUs são usadas principalmente por monitores de máquinas virtuais.

    
por 10.02.2016 / 05:30

Tags