Este artigo, em duas partes, vai mostrar como o kernel gerencia a sua memória.
?
Depois de examinar o layout do endereço virtual de um processo, recorremos ao kernel e seus mecanismos para gerenciar a memória do usuário. Aqui está o gonzo novamente:
Os processos do Linux são implementados no kernel como instâncias de estrutura da task, o descritor do processo. O campo mm em uma estrutura da task aponta para o descritor de memória, mm_struct, que é um sumário executivo da memória de um programa. Ele armazena o início e o final dos segmentos de memória, como mostrado acima, o número de páginas de memória física usadas pelo processo (rss significa for Resident Set Size), a quantidade de espaço de endereços virtuais usados, e outros fragmentos. Dentro do descritor da memória, nós também temo dois gerenciadores de memória para o programa: o conjunto de áreas de memória virtual e tabelas de memórias. Áreas de memória do gonzo são mostradas abaixo:
Cada área de memória virtual (VMA) é um alcance contíguo de endereços virtuais; essas áreas nunca se sobrepõem. Uma instância do vm_area_struct descreve totalmente a área da memória, incluindo seus endereços de início e fim, flags para determinar as permissões de acesso e comportamentos, e o campo vm_file para especificar qual arquivo está sendo mapeando pela área, se ele existir. Um VMA que não mapeia um arquivo é anônimo. Cada segmento de memória acima (por exemplo, heap, stack) corresponde a um único VMA, com a exceção do segmento de mapeamento da memória. Isso não é uma exigência, mas é comum em maquinas x86. VMAs não se importam em qual segmento eles estão.
Os VMAs de um programa estão armazenados no seu descritor de memória tanto como uma lista linkada no campo mmap, ordenada pelos endereços virtuais iniciais, e como um red-black tree, enraizado no campo mm_rb. A red-black tree permite que o kernel busque rapidamente pela área de memória que cobre um determinado endereço virtual. Quando você lê um arquivo /proc/pid_of_process/maps, o kernel simplesmente está passando por todas as listas linkadas de VMAs para os processos e imprimindo cada uma.
No Windows, o bloco EPROCESS é grosseiramente uma mistura de estrutura da task e mm_struct.O análogo do Windows ao VMA é o Virtual Address Descriptor, ou VAD; eles são armazenados na AVL tree. Você sabe o que é mais engraçado sobre o Windows e o Linux? São as pequenas diferenças.
O espaço para endereços virtuais de 4GB é dividido em páginas. Processadores x86 em modo 32bit suportam páginas com os tamanhos 4KB, 2MB e 4MB. Ambos Linux e Windows mapeiam a porção do usuário do espaço de endereços virtuais usando páginas de 4KB. Bytes 0-4095 caem na página 0, bytes 4096-8191 caem na página 1, e assim por diante. O tamanho de um VMA deve ser um múltiplo do tamanho da página. Aqui temos 3GB de espaço do usuário em páginas de 4KB:
O processador consulta as tabelas de páginas para traduzir um endereço virtual em um endereço de memória física. Cada processo tem seu próprio conjunto de tabelas de páginas: sempre que acontece a troca de processos, as tabelas de páginas para o espaço do usuário são trocadas também. O Linux armazena um ponteiro para as tabelas de páginas de um processo, no campo pgd do descritor de memória. Para cada página virtual ali, há a correspondência de uma entrada de tabela de página (PTE) nas tabelas de páginas, o que na paginação regular x86 é um simples registro de 4-byte mostrado abaixo:
Na segunda parte do artigo, a continuação de como o kernel faz o gerenciamento da memória.
?
Texto original disponível em http://duartes.org/gustavo/blog/post/how-the-kernel-manages-your-memory