Вопрос

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

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

Это было полезно?

Решение

Возьмите книгу «Внутренности Windows», там это описано очень подробно.Вкратце, однако, некоторые вещи, которые находятся в пространстве виртуальных адресов ядра (KVA):

1) Ядро и HAL

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

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

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

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

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

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

-Скотт

Другие советы

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

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

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

На мой взгляд, есть еще один малоизвестный факт о границе в 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-битная ОС).

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top