Pergunta

Como é amplamente conhecido, um programa rodando em 32 bits do sistema operacional Windows tem apenas 2GB de memória virtual disponível.Também é conhecido que os outros 2GB estão reservados, como espaço de Kernel.Mas o que é, na verdade, em que espaço de kernel?

Eu podia entender reserva necessária para o kernel em si, mas por espaço de kernel no VAS do processo?Obrigado.

Foi útil?

Solução

Obtenha o livro Windows Internals, ele descreve isso em detalhes sangrentos. Para o breve resumo, porém, algumas coisas que estão no espaço de endereço virtual do kernel (KVA):

1) O kernel e Hal

2) os drivers de dispositivo

3) Os montes do modo de kernel (chamados de piscinas executivas, que sempre acho divertidas)

4) Os objetos exportados para o modo de usuário via alças (processo, thread, evento, mutex, etc. Objetos)

5) PTES do sistema, que mapeiam todos os tipos de coisas interessantes dos aplicativos de modo de usuário suja (por exemplo, as pilhas de execução que os threads usam ao executar no modo kernel)

6) O cache do sistema de arquivos

E a lista continua e continua ... como eu disse, leia o Windows Internals.

-Scott

Outras dicas

The reason that kernel memory is mapped into the virtual address space of every process is so that a context switch into kernel mode does not have to change the process page tables. The current privilege level is merely lifted to 0, which immediately makes those pages accessible.

The page tables only have to be switched when a different process is switched to. Since this is an expensive operation (eg. it requires a TLB flush), minimising the frequency of it is a win.

Additionally, if you did switch in special kernel page tables went you switched to kernel space, you'd have to pick a part of the userspace address space to replace. This would make those userspace addressess inaccessible to the kernel, which would necessitate bounce buffers or more address space mucking about when data in those areas was to be transferred to or from the kernel.

Na minha opinião, há outro fato pouco conhecido sobre o limite de 2 GB. Muitas aplicações geralmente funcionam com muita aritmética do ponteiro (especialmente aplicações escritas em C, C ++, ...). Nessas aplicações, é bastante comum adicionar compensações aos ponteiros, ou mesmo subtrair ponteiros.

Se o seu espaço de endereço virtual disponível for de 2 GB, você garantirá que subtrair dois ponteiros esteja sempre entre -2147483647 e +2147483648 (esses são os limites para valores assinados de 32 bits).

Se o seu espaço de endereço fosse de 3 GB, a possível diferença seria maior do que qualquer valor que possa ser representado em um valor assinado de 32 bits.

Se você sabe que seu aplicativo é seguro e não subtraindo ponteiros totalmente não relacionados (e suas matrizes são menores que 2 GB!), Você pode dizer ao Windows que seu aplicativo pode funcionar com um espaço de endereço maior que 2 GB, definindo o sinalizador de ligante LargeAdDressEare ( ou defina isso com o utilitário Editbin).

Com o XP (não tenho certeza sobre o Vista e o W7), você pode inicializar em um modo em que o 'espaço do kernel' é de apenas 1 GB e 3 GB no espaço de endereço virtual é deixado para o aplicativo. Se o seu aplicativo for largoeaddressare, você obterá os 3 GB completos. Caso contrário, você só recebe 2 GB.

Em Windows de 64 bits, os aplicativos LargeAdDressAware de 32 bits recebem 4 GB, pois o Windows não precisa de espaço de endereço substancial na área de 32 bits (afinal, é um sistema operacional de 64 bits).

Programa escrito em linguagem de alto nível, como C++, é finalmente traduzido para o SO chamadas de API, especificamente, de API do Windows para o sistema operacional Windows.Muitos de API do Windows, como CreateFile, são, na verdade, falar com os controladores de modo de kernel.Espaço de Kernel no espaço de endereço de processo é utilizado para a alocação de recursos do kernel para que este processo.Por exemplo, controlador de chamadas IOCTL conter input-output buffers, passaram entre a API de modo de usuário e o controlador.Esses buffers são alocados no processo de espaço de kernel.

Geralmente, o espaço de kernel contém recursos alocados por componentes do modo de kernel em nome deste processo.

Sua pergunta parece ser "por que" não "o que" como apresentado no título.

Além disso, sua pergunta presume 32 bits. As versões de 64 bits do Windows são bastante diferentes (por exemplo, o VAS é de 8 TB ou 7 TB em um sistema Itanium).

Quanto a "Por que", como você passaria ponteiros de uma função do kernel (como um motorista) que não estão contidos no VAS do processo? Um bom livro para ler para descobrir isso seria Windows Internals.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top