
Desde o lançamento da edição anterior deste livro, o sistema operacional Windows percorreu um longo caminho em atualizações e mudanças conceituais que resultaram na nova arquitetura estável do kernel do Windows 10.
O livro "Dispositivo Interno do Windows" foi criado para profissionais que desejam entender a vida útil dos principais componentes do Windows 10. Com base nessas informações, será mais fácil para os desenvolvedores encontrar as soluções de design certas, criando aplicativos para a plataforma Windows e resolvendo problemas complexos associados à sua operação. Os administradores de sistema, sabendo o que está localizado sob o capô, sob o sistema operacional, serão capazes de entender o comportamento do sistema e resolver mais rapidamente problemas de aumento de produtividade e diagnóstico de falhas. Os profissionais de segurança precisarão de informações sobre como lidar com vulnerabilidades no sistema operacional.
Dinâmica da lista de páginas
Na fig. 5.37 mostra um diagrama de estado das transições dos blocos de páginas. Para simplificar, ele não fornece uma lista de páginas modificadas, mas não graváveis.
Os blocos de páginas se movem entre as listas de páginas das seguintes maneiras.
1. Quando um gerenciador de memória precisa de uma página preenchida com zeros para reparar um erro de página relacionado ao requisito de redefinição da página (acesso a uma página definida como completamente preenchida com zeros ou a uma página fechada e confirmada em modo de usuário que ainda não foi acessada), primeiro é feita uma tentativa de obter essa página da lista dessas páginas. Se a lista estiver vazia, a página é retirada da lista de páginas gratuitas e preenchida com zeros. Se a lista de páginas gratuitas estiver vazia, uma lista de páginas em espera será acessada e uma página dessa lista será preenchida com zeros.
2. Um dos motivos da demanda por páginas preenchidas com zeros é o cumprimento de vários requisitos de segurança - por exemplo, critérios comuns (Critérios Comuns). A maioria das disposições dos critérios gerais indica que os processos no modo de usuário devem receber blocos de páginas zerados para que não possam ler o conteúdo da memória dos processos anteriores. Portanto, o gerenciador de memória fornece processos no modo de usuário com blocos de páginas nulos, a menos que a página tenha sido lida no armazenamento de backup. Nesse caso, o gerenciador de memória usa blocos de páginas não redefinidos, inicializando-os com dados do disco ou do armazenamento remoto. A lista de páginas preenchidas com zeros é reabastecida da lista de páginas livres com um encadeamento de programa do sistema chamado encadeamento de página zero - este é o encadeamento 0 no processo do sistema. O fluxo de zeragem da página está aguardando um sinal funcionar do objeto de gateway. Quando há oito ou mais páginas na lista grátis, o gateway emite um sinal sonoro. Mas o encadeamento de zeragem da página será iniciado apenas se pelo menos um processador não tiver outros encadeamentos executáveis, pois o encadeamento de zeragem da página começa com a prioridade 0 e a menor prioridade que pode ser configurada para o fluxo do usuário é 1.
OBSERVAÇÃO Quando a memória devido à alocação de uma página física por um driver que chama a função MmAllocatePagesForMdl ou MmAllocatePagesForMdlEx deve ser preenchida com zeros pelo aplicativo Windows que chama a função AllocateUserPhysicalPages ou AllocateUserPhysicalPagesNuma, ou quando o aplicativo aloca páginas grandes que usam o gerenciador de memória, o aplicativo de memória está vazio. exibe áreas maiores que um fluxo de zeragem de página, redefinindo apenas uma página por vez. Além disso, em sistemas multiprocessadores, o gerenciador de memória cria um encadeamento adicional do sistema para zerar no modo paralelo (e nas plataformas NUMA isso é feito em um estilo otimizado para a tecnologia NUMA).
3. Quando o gerenciador de memória não precisa de uma página cheia de zeros, ele acessa primeiro a lista de páginas livres. Se esta lista estiver vazia, ela irá para a lista de páginas zeradas. Se a lista de páginas zeradas estiver vazia, ela será direcionada para a lista de páginas pendentes. Antes de o gerenciador de memória poder usar o bloco de páginas da lista de páginas em espera, ele deve primeiro voltar e remover o link do registro PTE inválido (ou do registro PTE do protótipo), que ainda aponta para o bloco de páginas. Como as entradas do banco de dados de números PFN contêm ponteiros reversos para a página anterior da tabela de páginas do usuário (ou para a página do conjunto de entradas protótipo PTE para páginas compartilhadas), o gerenciador de memória pode encontrar rapidamente a entrada PTE e fazer a alteração correspondente.
4. Quando um processo deve abandonar uma página do seu conjunto de trabalho (porque se refere a uma nova página e seu conjunto de trabalho está cheio ou porque o gerenciador de memória cortou seu conjunto de trabalho), a página vai para a lista de espera se permanecer intocada (inalterado) ou para a lista de páginas alteradas, se a página tiver sido alterada enquanto estiver na memória física.
5. Quando o processo for concluído, todas as páginas fechadas vão para a lista de páginas gratuitas. Além disso, se ao fechar o último link da seção suportada pelo arquivo de paginação, a seção não tiver exibições exibidas, as páginas desta seção também cairão na lista de páginas gratuitas.
EXPERIÊNCIA: VISUALIZANDO LISTAS DE PÁGINAS GRATUITAS E ZERADAS
A liberação de páginas fechadas no final de um processo pode ser observada na janela Informações do sistema do Process Explorer. Primeiro, você precisa criar um processo com muitas páginas fechadas em seu conjunto de trabalho. Já fizemos isso em um dos experimentos anteriores, usando o utilitário TestLimit:
C:\Tools\Sysinternals>Testlimit.exe -d 1 -c 1500 Testlimit v5.24 - test Windows limits Copyright (C) 2012-2015 Mark Russinovich Sysinternals - www.sysinternals.com Process ID: 13928 Leaking private bytes with touch 1 MB at a time... Leaked 1500 MB of private memory (1500 MB total leaked). Lasterror: 0 The operation completed successfully.
A opção –d faz com que o TestLimit não apenas selecione a memória como fechada e confirmada, mas também “toque” nela, ou seja, acesse essa memória. Isso resulta na alocação de memória física e sua atribuição ao processo, a fim de liberar a área de memória virtual confirmada e fechada. Se o sistema tiver uma quantidade suficiente de RAM disponível, até 1.500 MB serão alocados para o processo na RAM. Agora, esse processo aguardará até que você o force a concluir ou interromper o trabalho (possivelmente com a combinação de teclas Ctrl + C em sua janela de comando). Siga estes passos.
1. Abra o Process Explorer.
2. Selecione o comando ViewSystem Information e selecione a guia Memory.
3. Observe o tamanho das listas de páginas livres (zeradas) e livres (zeradas).
4. Finalize ou aborte o processo TestLimit.
Você pode ver que a lista de páginas gratuitas aumentou momentaneamente de tamanho. Dizemos “talvez” porque o fluxo de zeragem da página será ativado assim que houver apenas oito entradas na lista de páginas zeradas e funcionará muito rapidamente. O Process Explorer atualiza essa janela apenas uma vez por segundo e parece que o restante das páginas já tem tempo para redefinir a lista de páginas de redefinição, enquanto conseguimos "capturar" esse estado. Se você conseguir perceber um aumento temporário na lista de páginas gratuitas, depois disso, verá que o tamanho cairá para zero e um aumento correspondente ocorrerá na lista de páginas zeradas. Se o momento for perdido, você verá um aumento na lista de páginas zeradas.
EXPERIMENTO: VISUALIZANDO LISTAS DE PÁGINAS ALTERADAS E ESPERADAS
Mover páginas do conjunto de trabalho do processo para a lista de páginas modificadas e depois para a lista de páginas em espera pode ser observada usando os programas VMMap e RAMMap do pacote Sysinternals ou no depurador do kernel. Siga estes passos.
1. Execute o programa RAMMap e observe o estado calmo do sistema. Nesse caso, é um sistema x86 com 3 GB de RAM. As colunas na janela refletem os diferentes estados das páginas (veja a Fig. 5.37). Algumas colunas que não são relevantes para este experimento foram reduzidas por conveniência.
2. O sistema possui cerca de 420 MB de RAM livre (consistindo em páginas gratuitas e zeradas). Aproximadamente 580 MB aparecem na lista de páginas em espera (portanto, algumas estão "disponíveis", mas provavelmente contêm dados perdidos anteriormente por processos ou usados em super amostragem). Cerca de 830 MB estão ativos, sendo mapeados diretamente para endereços virtuais por meio de entradas válidas na tabela de páginas.
3. Cada linha é subdividida de acordo com os estados das páginas por uso ou origem (páginas de processo fechadas, arquivo exibido etc.). Por exemplo, no momento dos 830 MB ativos, cerca de 400 MB são devidos à alocação de páginas fechadas do processo.
4. Agora, como no experimento anterior, use o utilitário TestLimit para criar um processo com um grande número de páginas no conjunto de trabalho. Aqui, novamente, usamos a opção –d para forçar o TestLimit a gravar em cada página, mas desta vez sem limitação, para criar o maior número possível de páginas modificadas fechadas:
C:\Tools\Sysinternals>Testlimit.exe -d Testlimit v5.24 - test Windows limits Copyright (C) 2012-2015 Mark Russinovich Sysinternals - www.sysinternals.com Process ID: 7548 Leaking private bytes with touch (MB)... Leaked 1975 MB of private memory (1975 MB total leaked). Lasterror: 8
5. Agora, o TestLimit criou 1975 áreas de alocação de 1 MB cada. Para atualizar a tela no RAMMap, é necessário usar o comando FileRefresh para atualizar a tela, pois o RAMMap não faz isso por conta própria (devido ao alto custo dessa operação).
6. Como você pode ver, mais de 2,8 GB estão ativos, dos quais 2,4 GB estão na linha de páginas de processo fechadas (linha Process Private). Esse é o resultado da alocação de memória e do acesso ao processo TestLimit. Observe também que as listas de páginas em espera, zeradas e gratuitas agora são muito menores. A maior parte da memória alocada para TestLimit foi obtida das páginas listadas nessas listas.
7. Em seguida, usando o RAMMap, é necessário avaliar a alocação das páginas físicas do processo. Vá para a guia Páginas físicas e defina o filtro na parte inferior da coluna Processo, definindo-o como Testlimit.exe. A próxima janela mostra todas as páginas físicas que fazem parte do conjunto de trabalho do processo.
8. Precisamos identificar a página física envolvida na alocação do espaço de endereço físico, que foi realizado usando a opção –d quando o programa TestLimit foi iniciado. O RAMMap não fornece nenhuma indicação de quais áreas virtuais foram alocadas devido à chamada da função RAMMap VirtualAlloc. Mas podemos obter uma dica valiosa sobre esse assunto usando o programa VMMap. Chamando o VMMap para
do mesmo processo, obtemos o seguinte resultado (veja a figura na página 535 acima).
9. Na parte inferior das informações exibidas, existem centenas de áreas alocadas para dados de processo fechado, cada uma com tamanho de 1 MB com 1 MB de memória confirmada. Isso corresponde ao tamanho da memória alocada pelo TestLimit. A captura de tela anterior destaca a primeira dessas opções de distribuição. Observe que seu endereço virtual inicial é 0x310000.
10. Agora, volte às informações sobre a memória física exibida na tela pelo programa RAMMap. Reorganize as colunas para que a coluna Endereço virtual fique claramente visível. Clique nele para classificar as linhas por esse valor e você poderá encontrar o endereço virtual desejado (veja a figura na página 535 abaixo).
11. Aqui é mostrado que a página virtual que começa com o endereço 0x310000 está atualmente mapeada para o endereço físico 0x212D1000. Com a opção -d, TestLimit grava seu nome nos primeiros bytes de cada área selecionada. Isso pode ser demonstrado usando o comando! Dc do depurador do kernel local (dc significa “display characters”, ou seja, produzindo caracteres para um endereço físico):
lkd> !dc 0x212d1000 #212d1000 74736554 696d694c 00000074 00000000 TestLimit....... #212d1010 00000000 00000000 00000000 00000000 ................ ...
12. Se você atrasar, a tentativa poderá falhar - a página já pode ser excluída do conjunto de trabalho. Na última fase do experimento, mostraremos que os dados permanecem inalterados (pelo menos por um tempo) após a redução do conjunto de trabalho do processo e a página é movida primeiro para a lista de páginas alteradas e depois para as páginas em espera.
13. Após selecionar o processo TestLimit no programa VMMap, abra o menu View e selecione o comando Empty Working Set para minimizar o conjunto de trabalhos do processo. Agora, na janela VMMap, as seguintes informações devem ser exibidas:
14. Observe que a linha do conjunto de trabalho está quase vazia. A parte do meio do processo mostra que o tamanho total do conjunto de trabalho é de apenas 4 KB, com quase todo o seu espaço ocupado por tabelas de páginas. Agora volte ao RAMMap. Na guia Usar contagens, você pode ver que o número de páginas ativas foi reduzido significativamente e um grande número de páginas está na lista de alterações e um número significativo de páginas está na lista de espera.
15. Os dados na guia Processos do RAMMap confirmam que a maioria dessas páginas apareceu nessas listas devido ao processo TestLimit.
»Mais informações sobre o livro podem ser encontradas no
site do editor»
Conteúdo»
Trecho20% de desconto no cupom para
Windows -
Windows