- Características gerais
Em geral, um esquema que mistura paginação e segmentação é utilizado para contruir o esquema de memória virtual. Entretanto, o Linux utiliza segmentação de forma extremamente limitada. Linux prefere paginação à segmentação por motivos de portabilidade e para tornar o gerenciamento de memória mais simples. Na versão 2.4, por exemplo, segmentação é utilizada apenas quando exigida pela arquitetura 80x86.
Como a maioria dos processos utilizam apenas uma pequena porção do espaço total de endereço virtual, Linux utiliza uma estrutra hierárquica para a tabela de páginas, constituída por três níveis. Isto permite que as subárvores correspondentes a regiões não utilizadas do espaço de endereço estejam ausentes, economizando espaço.
Proteção é garantida já que cada processo no sistema tem seu próprio espaço de endereço virutal. Estes estão separados de modo que um processo executando determinada apliacação não pode afetar um outro. Além disso, mecanismos de hardware permitem que determinadas regiões de memória estejam protegidas contra escrita. Isso evita que código e dado sejam sobrescritos por aplicações maliciosas.
- Funcionamento do Translation Lookaside Buffer (TLB)
Assim, cada vez que uma referência a um endereço virtual é feita, o processador tentará encontrar uma entrada correspondente no cache (TLB). Se não encontrar na TLB, deve sinalizar para o Sistema Operacional que uma TLB miss ocorreu. O SO então gera uma nova entrada TLB. Quando a exceção for eliminada, o processador tentará mais uma vez buscar o endereço na TLB, desta vez com sucesso. A desvantagem deste esquema é que tempo e espaço são gastos para manter tal cache.
- Tabelas de páginas (page tables)
O acesso à tabela de páginas é realizado em três passos, o que corresponde ao esquema de três níveis adotado em Linux. As três tabelas são: Page Global Directory, Page Middle Directory e Page Table. O objetivo desse esquema é reduzir a quantidade de RAM necessária por tabela de página por processo. Ele reduz a memória necessária já que requer Page Tables apenas para as regiões da memória virtual de fato utilizadas por um processo.
- Remoção de Páginas no Linux
Vários kernels têm utilizado algoritmos Least Recently Used (LRU). A prinicpal idéia é utilizar um contador que armazena a idade da página junto de cada página na RAM (isto é, o intervalo de tempo desde o último acesso à referida página). A página mais velha pode então ser removida.
- Interfaces para gerenciamento de memória
Quando da criação de um novo processo, o kernel invoca copy_mm() para criar o espaço de endereços do processo e settar todas tabelas de páginas e memory descriptor do novo processo.
Quando um processo termina, o kernel invoca exit_mm() para liberar o espaço de endereços daquele processo.
Note ainda que um processo pode criar um novo mapeamento de memória através da chamada mmap().
- Compartilhamento de Memória no Linux
- Mapeamento de arquivos na memória virtual
- inode associado com o arquivo mapeado
- address_space
- file object para cada mapeamento feito por um processo diferente
- vm_area_struct
- page descriptor
- Tratamento de áreas de memória fixas
- Segurança
O uso desste mecanismo requer suporte tanto nas estruturas de dados do processo assim como naquilo que está sendo protegido, por exemplo, arquivos. Assim, no sistema de arquivos Ext2, cada arquivo pertence a um usuário específico, o qual decide que tipo de operações são permitidas naquele arquivo. Quando um processo tenta acessar um arquivo, o VFS sempre checa se tal acesso é permitido, de acordo com as permissões estabelecidadas pelo dono do usuário e credenciais do processo.
- Área de swap
MAX_SWAPFILES (normalmente 32).
As informações contidas em uma área de swap são úteis enquanto o sistema estiver ligado. Quando este for desligado, todos os processos são destrúidos, então toda informação armazena nas áreas de swap pelos processos é descartada.
O tamanho máximo de uma área de swap é determinado pelo número de bits disponíveis para identificar um slot de página. Na arquitetura 80x86, 24 bits estão disponíveis portanto o limite para o tamanho da área de swap é 224 slots (64 GB).
- Experimentos
Para testar o máximo tamananho de área heap, podemos executar um programa que continuamente pede alocação de memória para um inteiro, por exemplo.
O tamanho máximo de pilha é 8MB. Como mencionado anteriormente, existe um tamanho máximo para a área de swap, portanto ela pode ser esgotada.
- Referencias
No comments:
Post a Comment