Como o endereço do kernel trocou páginas de memória na partição swap \ file?

3

Uma partição swap não contém um sistema de arquivos estruturado. O kernel não precisa disso porque armazenou páginas de memória na partição marcada como área de troca. Como pode haver várias páginas de memória que na área de troca, como o kernel localiza cada página quando um processo solicita que sua página seja carregada na memória. Vamos explicar mais, olhando para o cabeçalho da partição swap do sistema operacional Devuan:

#define SWAP_UUID_LENGTH 16
#define SWAP_LABEL_LENGTH 16
struct swap_header_v1_2 {
    char          bootbits[1024];    /* Space for disklabel etc. */
    unsigned int  version;
    unsigned int  last_page;
    unsigned int  nr_badpages;
    unsigned char uuid[SWAP_UUID_LENGTH];
    char          volume_name[SWAP_LABEL_LENGTH];
    unsigned int  padding[117];
    unsigned int  badpages[1];
};

Então, quando o comando mkswap é executado para uma partição, é o que é colocado nessa partição, o cabeçalho de troca.

Agora, vamos ter um cenário em que o processo A tenha sua página de memória trocada e, portanto, há uma página de memória na área de troca. Naturalmente, pode haver muitas páginas de memória na área de troca. Agora, o processo A precisa acessar a página de memória que foi trocada. O processo A informa ao kernel, posso ter minha página de memória trocada, por favor? O núcleo diz: com certeza meu querido amigo. O kernel vai procurar a página de memória do processo A na partição swap. Já que a partição swap não é uma estrutura sofisticada (não um sistema de arquivos) como o kernel saberia como localizar aquela página de memória específica do processo A na partição swap.

Talvez o kernel em algum lugar armazene endereços de setor para essas páginas trocadas, então quando um processo pede sua página de memória, o kernel sabe onde procurar na partição swap, lê a página de memória da partição e a carrega na memória. / p>     

por direprobs 20.08.2017 / 14:31

1 resposta

6

O swap é válido apenas durante uma determinada inicialização, portanto, todas as informações de rastreamento são mantidas na memória. Trocando páginas para dentro e para fora é tratado inteiramente pelo kernel e é transparente para os processos. Basicamente, a memória é dividida em páginas, rastreadas em tabelas de páginas; estas são estruturas definidas por cada arquitetura de CPU. Quando uma página é trocada, o kernel a marca como inválida; assim, da próxima vez que qualquer coisa tentar acessar a página, a CPU irá falhar, o que fará com que um manipulador no kernel seja invocado; É responsabilidade desse manipulador restaurar o conteúdo da página.

No Linux, há uma estrutura swap_info que descreve cada dispositivo ou arquivo de troca. Dentro dessa estrutura, um swap_map mapeia páginas de memória para blocos no dispositivo de troca ou arquivo. Quando uma página é desfeita, o kernel armazena o swap_info index e swap_map offset na entrada da tabela de páginas correspondente, o que permite encontrar a página no disco quando necessário. (Todas as arquiteturas suportadas fornecem espaço suficiente para isso em suas tabelas de páginas, mas existem limites - por exemplo. o espaço disponível significa que o Linux pode gerenciar no máximo 64GiB de troca em x86.)

Você encontrará uma descrição muito mais detalhada de tudo isso no capítulo "Gerenciamento de swap" de Mel Gorman's Entendendo o gerenciador de memória virtual do Linux .

    
por 20.08.2017 / 15:27