Архитектура памяти
Организация системного адресного пространства
Как уже отмечалось, системное адресное пространство сильно отличается от пользовательского:
- Системное адресное пространство одинаково вне зависимости от текущего контекста памяти, то есть от содержимого пользовательского адресного пространства.
- В системном адресном пространстве имеются диапазоны памяти как выгружаемые на диск, так и не выгружаемые.
На рис. 6 показана приблизительная организация системного адресного пространства для платформы х86.
Рис. 6. Организация системного адресного пространства
Типы адресов в NT
Как мы уже отмечали, линейный и виртуальный адреса в NT совпадают. Здесь и далее мы будем пользоваться термином виртуальный адрес.
Виртуальный адрес транслируется в физический адрес. Этот адрес соответствует физической памяти.
Кроме этих двух типов адресов существует еще один – логический адрес, реализуемый на уровне HAL.
HAL поддерживает гибкую модель для адресации аппаратных устройств. В соответствии с этой моделью, устройства подключаются к шинам, каждая из которых имеет свое собственное адресное пространство. Реально эти адреса могут быть как в пространстве портов ввода/вывода, так и в пространстве памяти.
Прежде чем может быть произведено обращение к некоторому адресу устройства (посредством функции HAL), адрес должен быть переведен из относительного адреса для шины в некоторый транслированный модулем HAL адрес. Этот транслированный адрес и есть логический адрес. Он имеет смысл только для HAL и не имеет ничего общего с конкретным адресом для работы с оборудованием.
Для получения логического адреса из шинного адреса служит функция HaltranslateBusAddress(). Полученный адрес будет находиться либо в пространстве портов ввода/вывода, либо в обычном пространстве памяти. В последнем случае для использования в драйвере полученный логический адрес должен быть преобразован к адресу в невыгружаемой области системного адресного пространства. Это делается посредством вызова функции MmMapIoSpace().