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