Interrupções e traps são sustentadas dentro do contexto da corrente tarefa. Em particular, o diretório de páginas do corrente processo é usado na tradução de endereços.

Os segmentos, de qualquer modo, são segmentos Kernel para que todos os endereços lineares apontem para dentro da memória Kernel quer acessar uma variável no endereço 0 x 01. O endereço linear é 0 x 00000001 (usando segmentos Kernel) e o endereço físico é 0 x 01.

O último é porque a página do processo diretório mapea esta extensão exatamente como page_pg_dir.
O espaço Kernel (0 x c 0000000 + high – memory) e mapeado pela tabela de páginas Kernel que são eles mesmos parte da memória reservada. Eles são consequentemente divididas por todos processos. Durante um fork copy-page-tables ( ) trata tabela de páginas reservadas diferentemente.

Isto põe indicadores no diretório de páginas de processo para indicar para tabelas de página Kernel e na verdade não distribui novas tabelas de páginas como isto faz normalmente.

Como um exemplo o Kernel – Stack – page ( que ocupa algum lugar no espaço Kernel ) não precisa de um associado page – table distribuídos no pg-dir do processo para mapeá-lo.

O interruptor de instruções põe o indicador stack e o segmento stack do privilégio valor salvo no Tss do corrente task. Note que o Kernel stack é um objeto realmente fragmentado – Isto não é um objeto único, mas sim um grupo de stack frames.

Cada um distribuído quando um processo é criado e deixado quando ele sai. O Kernel stack não deveria crescer tão rapidamente dentro de um contexto de um processo que extende abaixo da corrente frame.

 

4.5 – Adquirindo e liberando memórias

 

Quando qualquer rotina Kernel precisa de memória isto acaba chamando get-free-page ( ). Este está num nível mais baixo do que Kmallor ( ) (de fato Kmalloc ( ) get-free-page ( ) quando isto precisa mais memória). Get-free-page ( ) toma um parâmetro, a prioridade.

Possíveis valores são gfp_buffer_gfp, Kernel, gfp,nfs e gfp atomic. Isto tira uma página do the free-page-list, atualizados mem_map, zeram a página e retorna o endereço físico da página (note que Kmalloc) retorna um endereço físico.

A lógica do mm depende do mapa da identidade entre o endereço lógico e físico.

Isto é por ele mesmo bastante simples. O problema é claro, é que o free-page-list pode estar vazio. Se você não requisitar uma operação atômica, nesta etapa, você entra dentro do domínio de uma page stealing e que nós discutiremos em um momento.

Como um último recurso ( e para requisitos atômicos) uma página é separada do secundary-page-list (como você pode ter achado, quando páginas são libertadas, o secundary-page-list enche primeiro a manipulação atual da page-list e mem-map ocorre neste misterioso macro chamado remove-from-mem-queve ( ) que você provavelmente nunca quer investigar.

O suficiente para dizer que interrupções são incapacitados. [Eu penso que isto deveria ser explicado aqui. Isto não é tão difícil…]

Agora de volta ao "Roubando páginas" get-free-page ( ) chame try-to-fre-page ( ) que chame repetidamente shrink_buffers ( ) e swap-out ( ) nesta ordem até conseguir liberar uma página.

A prioridade é aumentada em cada iteration sucessiva para que estas duas rotinas processem suas page-sterling-loops mais frequentemente. Aqui está um exemplo do processo swap-out:

• Faça a tabela do processo e adquira uma swappable task, por exemplo, Q.
• Ache um user page-table (não reservado) no espaço de Q.
• Para cada página na tabela try-to-swap-out (page)
• Termina quando a página é liberada.
Note que swap-out ( ) (chamada try-to-free-page ( )) mantém variáveis estatísticas e deste modo isto pode resumir a procura onde terminar a chamada anterior try-to-swap-out ( ) examine os page-tables de todos usar process e obrigue o sterling policy:

1) Não brincar com as páginas (reserved) reservadas
2) Envelheçar a página se ela é marcada acessada (1 bit)
3) Não mexa com página adquirida recentemente (last-free-pages ( ))
4) Deixe páginas sujas com map-counts > 1 intocadas
5) Diminua o map-count das páginas limpas
6) Librere páginas limpas se elas não são mapeadas
7) Troque páginas sujas com um map-count de 1

De todas essas ações, 6 e 7 vão parar o processo poruqe eles resultam na liberação atual de uma página física.
A quinta ação resulta uma dos processos perdendo uma página limpa não dividida que não foi acessada recentemente (diminuindo Q à rss) que não é tão ruim, mas os efeitos cumulativos de algumas iterations pode atrasar o processo muito.

No presente, há 6 iterations, deste modo uma página dividida por 6 processos pode ser roubada se está limpa. Page table então são atualizados e o TLB invalidado. O trabalho atual de liberar uma página é feito por free-page ( ), a complementação de get-free-page ( ).

Isto ignora páginas reservadas, atualiza mem-map, e libera a página e atualiza o page-list (s) se não é mapeada. Para troca (em 6 em cima), write-swap-page ( ) é chamada e não faz nada notável da perspectiva da administração da memória.

Os detalhes de shink-buffers ( ) nos levaria muito longe. Essencialmente isto procura free "buffers" (buffers são uma parte da memória que segura informação temporariamente quando dados transferem de um lugar para outro) em seguida escreve buffers sujos, e depois começa com buffers ocupados e chama free-page ( ) quando pode liberar todos os buffers numa página.

Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Páginas ( 6 de 14 ): « Previous12345 6 7891011121314Next »