Pregunta

Como es ampliamente conocido, un programa que se ejecuta bajo el sistema operativo Windows de 32 bits sólo tiene 2 GB de memoria virtual disponible. También se sabe que el otro 2 GB están reservados como el espacio del núcleo. Pero lo que es realmente en ese espacio del núcleo?

Me podía entender la reserva necesaria para el núcleo en sí, pero el espacio del kernel en qué VAS del proceso? Gracias.

¿Fue útil?

Solución

Obtener el libro de Windows Internos, se describe en detalle sangriento. Para el breve resumen, sin embargo, algunas cosas que están en el espacio del núcleo virtual de la dirección (KVA):

1) el núcleo y HAL

2) Los controladores de dispositivo

3) Los montones de modo kernel (llamadas las piscinas ejecutivos, que siempre me pareció divertida)

4) Los objetos exportados a modo de usuario a través de asas (proceso, hilo, evento, mutex, etc. objetos)

5) PTE de sistema, que el mapa de todo tipo de cosas interesantes lejos de las aplicaciones en modo de usuario sucia (por ejemplo, las pilas de ejecución que utilizan hilos cuando se ejecuta en modo kernel)

6) La caché de sistema de archivos

Y la lista sigue y sigue ... Como he dicho, leer Windows Internals.

-Scott

Otros consejos

La razón de que la memoria del núcleo es mapeado en el espacio virtual de direcciones de cada proceso es para que un cambio de contexto en modo de núcleo no tiene que cambiar las tablas de páginas del proceso. El nivel de privilegio actual se limitó a levantar a 0, que inmediatamente hace que esas páginas accesibles.

Las tablas de páginas solamente tiene que ser cambiado cuando un proceso diferente se cambia a. Dado que esta es una operación costosa (por ejemplo. Se requiere un rubor TLB), minimizando la frecuencia de la misma es una victoria.

Además, si hizo interruptor en mesas especiales página núcleo fue de cambiar al espacio del núcleo, que tendría que recoger una parte del espacio de direcciones del espacio de usuario para reemplazar. Esto haría que los espacio de usuario addressess inaccesible para el kernel, lo que exigiría buffers o más espacio de direcciones curioseaba cuando los datos en esas áreas era para ser transferidos hacia o desde el núcleo.

En mi opinión hay otro hecho poco conocido sobre el límite de 2 GB. Muchas aplicaciones suelen trabajar con una gran cantidad de la aritmética de punteros (especialmente aplicaciones escritas en C, C ++, ...). En estas aplicaciones, es bastante común para agregar compensaciones a los punteros, o incluso para restar punteros.

Si su espacio de direcciones virtual disponible es de 2 GB, se le garantiza que restar dos punteros está siempre entre -2147483647 y 2147483648 (estos son los límites para los valores con signo de 32 bits).

Si su espacio de direcciones sería 3GB, la posible diferencia sería más grande que cualquier valor que se puede representar en un valor de 32 bits.

Si usted sabe que su aplicación es segura y no restando punteros sin relación alguna (y sus matrices son menos de 2 GB!), Puede indicar a Windows que su aplicación puede trabajar con un mayor espacio de direcciones de 2 GB, estableciendo el enlazador bandera LARGEADDRESSAWARE (o conjunto de esta con la utilidad EDITBIN).

Con XP (no muy seguro de Vista y W7) puede arrancar en un modo en el 'espacio del núcleo' sólo es de 1 GB y 3 GB de espacio de direcciones virtuales se deja para la aplicación. Si su aplicación es LARGEADDRESSAWARE, se obtiene el total de 3GB. Si no es así, que sólo recibe 2 GB.

En 64 bits aplicaciones de Windows, LARGEADDRESSAWARE 32 bits incluso obtener 4 GB, ya que Windows no necesita espacio de direcciones sustancial en el área de 32 bits (después de todo, es un sistema operativo de 64 bits).

programa escrito en lenguaje de alto nivel, como C ++, se traduce finalmente a utilizar llamadas a la API, específicamente, la API de Windows para el sistema operativo Windows. Muchos API de Windows, como CreateFile, son en realidad charla con controladores en modo kernel. el espacio del núcleo en el espacio de direcciones del proceso se utiliza para la asignación de recursos del kernel para este proceso. Por ejemplo, controlador IOCTL llamadas contienen buffers de entrada-salida, pasaron entre el API de modo de usuario y el controlador. Tales tampones se asignan en el espacio de proceso kernel.

En general, el espacio del núcleo contiene recursos asignados por los componentes de modo de núcleo en nombre de este proceso.

Su pregunta parece ser "por qué" no "qué" como se planteó en el título.

Además, su pregunta presume de 32 bits. versiones de 64 bits de las ventanas son muy diferentes (por ejemplo, el EVA es de 8 TB, o 7TB en un sistema Itanium).

En cuanto a "qué", ¿cómo pasar punteros de una función del núcleo (como un conductor) que no están contenidos en la EVA del proceso? Un buen libro para leer de resolver esto sería Windows Internals.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top