Что содержится в памяти ядра в ОС Windows? - PullRequest
1 голос
/ 31 августа 2010

Как известно, в программе, работающей под 32-битной ОС Windows, доступно всего 2 ГБ виртуальной памяти. Также известно, что другие 2 ГБ зарезервированы как пространство ядра. Но что на самом деле в этом пространстве ядра?

Я мог понять резерв, необходимый для самого ядра, но зачем пространство ядра в VAS процесса? Спасибо.

Ответы [ 5 ]

9 голосов
/ 31 августа 2010

Получить книгу Windows Internals, она описывает это в мельчайших подробностях.Однако, для краткого изложения, некоторые вещи находятся в пространстве виртуальных адресов ядра (KVA):

1) Ядро и HAL

2) Драйверы устройств

3) Кучи режима ядра (называемые исполнительными пулами, которые я всегда нахожу забавными)

4) Объекты, экспортируемые в режим пользователя через дескрипторы (объекты процесса, потока, события, мьютекса и т. Д.)

5) Системные PTE, которые отображают все виды интересных вещей из грязных приложений пользовательского режима (например, стеки выполнения, которые потоки используют при работе в режиме ядра)

6) Кэш файловой системы

И этот список можно продолжать и продолжать ... Как я уже сказал, прочитайте внутренние компоненты Windows.

-scott

3 голосов
/ 01 сентября 2010

Причина, по которой память ядра отображается в виртуальном адресном пространстве каждого процесса, заключается в том, что переключение контекста в режим ядра не должно изменять таблицы страниц процесса. Текущий уровень привилегий просто повышен до 0, что сразу делает эти страницы доступными.

Таблицы страниц необходимо переключать только при переключении на другой процесс. Поскольку это дорогостоящая операция (например, она требует сброса TLB), минимизация его частоты является выигрышем.

Кроме того, если вы сделали в специальных таблицах страниц ядра и переключились на пространство ядра, вам придется выбрать часть адресного пространства пользовательского пространства для замены. Это сделало бы эти адреса пользовательского пространства недоступными для ядра, что потребовало бы отказов буфера или большего количества адресации пространства адресов, когда данные в этих областях должны были быть переданы в или из ядра.

2 голосов
/ 31 августа 2010

На мой взгляд, есть еще один малоизвестный факт о границе 2 ГБ. Многие приложения обычно работают с большим количеством арифметики с указателями (особенно приложения, написанные на C, C ++, ...). В этих приложениях довольно часто добавляют смещения к указателям или даже вычитают указатели.

Если доступное виртуальное адресное пространство составляет 2 ГБ, вам гарантировано, что вычитание двух указателей всегда находится между -2147483647 и +2147483648 (это ограничения для 32-разрядных значений со знаком).

Если ваше адресное пространство будет 3 ГБ, возможная разница будет больше, чем любое значение, которое может быть представлено в 32-разрядном значении со знаком.

Если вы знаете, что ваше приложение безопасно и не вычитает полностью несвязанные указатели (и ваши массивы меньше 2 ГБ!), Вы можете указать Windows, что ваше приложение может работать с адресным пространством, превышающим 2 ГБ, установив компоновщик пометьте LARGEADDRESSAWARE (или установите это с помощью утилиты EDITBIN).

С XP (не совсем уверен в Vista и W7) вы можете загрузиться в режиме, где «пространство ядра» составляет всего 1 ГБ, а 3 ГБ в виртуальном адресном пространстве оставлено для приложения. Если ваше приложение LARGEADDRESSAWARE, вы получите все 3 ГБ. Если нет, вы получите только 2 ГБ.

В 64-разрядных Windows 32-разрядные приложения LARGEADDRESSAWARE даже получают 4 ГБ, поскольку Windows не требуется значительного адресного пространства в 32-разрядной области (в конце концов, это 64-разрядная ОС).

1 голос
/ 31 августа 2010

Ваш вопрос, кажется, «почему», а не «что», как указано в заголовке.

Кроме того, ваш вопрос предполагает 32-разрядный.64-разрядные версии окон весьма различны (например, VAS составляет 8 ТБ или 7 ТБ в системе Itanium).

Что касается «почему», как бы вы передавали указатели из функции ядра (например, драйвера), которые не содержатся в VAS процесса?Хорошая книга, чтобы понять это, была бы Windows Internals.

1 голос
/ 31 августа 2010

Программа, написанная на языке высокого уровня, например, C ++, наконец переводится в вызовы API API, в частности, Windows API для ОС Windows.Многие Windows API, такие как CreateFile, на самом деле общаются с драйверами режима ядра.Пространство ядра в адресном пространстве процесса используется для выделения ресурсов ядра для этого процесса.Например, вызовы драйвера IOCTL содержат буферы ввода-вывода, передаваемые между API пользовательского режима и драйвером.Такие буферы выделяются в пространстве ядра процесса.

Как правило, пространство ядра содержит ресурсы, выделенные компонентами режима ядра от имени этого процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...