Como o kernel unix original endereçou a memória?

3

Hoje, praticamente todos os kernels usam a memória virtual fornecida pela MMU. Eles fazem isso com a tabela de páginas global, cujo endereço está localizado em um registrador de CPU e um supervisor de página / mapeador de páginas em processos. O "vm" em vmlinuz , por exemplo, significa que o kernel linux suporta memória virtual.

Tudo isso é possível porque o MMU mapeia endereços contínuos de memória para os segmentos de memória compreendidos pela arquitetura x86.

O kernel UNIX original tinha uma versão vmunix , que, acredito, deve ter usado uma técnica similar. No entanto, o kernel UNIX original foi escrito antes de as MMUs estarem disponíveis. Se não estou enganado, o kernel UNIX original (chamado simplesmente de unix ) foi escrito antes da existência da arquitetura x86. Historicamente, ele foi executado no PDP-9 e no PDP-11.

Como esse kernel executou o endereçamento e o gerenciamento de memória? Foi um endereçamento baseado em segmentos (dois números) ou endereçamento de memória total (um único número)? Como separou a memória entre processados?

    
por grochmal 25.12.2016 / 16:30

2 respostas

5

A memória virtual é quase uma década mais antiga que o Unix: havia uma na Burroughs B5000 em 1961. Ele não tinha uma MMU no sentido moderno (isto é, baseado em páginas), mas fornecia as mesmas funções básicas. O IBM System / 360 Modelo 67 em 1965 (ainda mais antigo que o Unix) tinha um MMU. Os processadores Intel x86 não receberam uma MMU até o 80386 em 1986.

Implementar um sistema Unix na verdade não requer uma MMU. Isso requer alguma forma de memória virtual, caso contrário, implementar a fork chamada do sistema é proibitivamente difícil. A chamada do sistema fork , para criar processos copiando um processo existente, era uma parte fundamental do Unix desde a primeira versão, por isso exigia memória virtual. Veja D. M. Ritchie e K. Thompson, Sistema de Compartilhamento de Tempo do UNIX , CACM, 1974 , §V “Processos e imagens”.

Eu não sei os detalhes do hardware que as primeiras versões do Unix rodaram, mas eles tinham memória virtual na forma de um arquitetura segmentada . A CPU traduzida entre ponteiros desreferenciados por um programa (endereços virtuais) e locais reais na memória (endereços físicos). O mapeamento foi realizado adicionando um deslocamento ao endereço virtual. Em cada mudança de contexto entre processos, o registro contendo o offset foi ajustado.

Embora virtualmente todas as implementações Unix forneçam isolamento do processo, este não foi o caso de algumas implementações históricas em hardware que não tinham proteção de memória (tanto nos anos 70, como também nos anos 80 com MINIX em 8088 e 80286). A proteção da memória é um pouco ortogonal para abordar a virtualização; uma MMU fornece ambos, uma arquitetura segmentada simples não, uma MPU fornece proteção sem virtualização. Existe uma implementação Linux para sistemas sem uma MMU, uCLinux , mas devido à falta de fork muitos programas não podem rodar ( o único suporte de fork é vfork que requer um execve chame a criança imediatamente depois disso.

¹ Um MPU (unidade de proteção de memória) registra os direitos de acesso para cada página da memória.

    
por 27.12.2016 / 01:10
2

Você não precisa de uma MMU de paginação para obter proteção de memória.

MMUs de paginação resolvem muitos problemas mais avançados, como fragmentação de memória (indisponibilidade de blocos grandes) e mmap (mantém apenas partes recentemente usadas de um arquivo na memória). E os MMUs de paginação são necessários para implementar um "cache de páginas unificado" para armazenar em cache os acessos a arquivos em todos os processos.

Mas a proteção básica de memória pode ser feita apenas com uma "segmentação" mais simples, provavelmente disponível para implementações iniciais do Unix. Por exemplo, a memória do kernel protegido pode ser colocada em um segmento definido como "sem acesso" quando o código do modo de usuário é executado. Mesmo no sistema operacional Linux moderno paginado, as chamadas de sistema brk() e sbrk() existem como atrasos de compatibilidade dos dias de implementações segmentadas.

Essencialmente, a segmentação é como uma MMU paginada, exceto que você só obtém um número fixo de "páginas" de tamanho variável (na verdade chamadas de segmentos), em vez de um número variável de páginas de tamanho fixo.

Ainda hoje, a segmentação vive em microcontroladores de baixo custo que podem ter apenas alguns kilobytes de SRAM, tornando possível implementar um pequeno sistema operacional com memória protegida, apesar da ausência de uma MMU de paginação real.

    
por 25.12.2016 / 20:25