Сопоставление Bus-Relative адресов с виртуальными адресами
Некоторые процессоры реализуют отдельные адресные пространства памяти и ввода-вывода, а другие — нет. Из-за этих различий в аппаратных платформах механизм, используемый драйверами для доступа к ресурсам устройств ввода-вывода или постоянного устройства в памяти, отличается в разных платформах.
Драйвер запрашивает ресурсы ввода-вывода устройства и памяти в ответ на IRP_MN_QUERY_RESOURCE_REQUIREMENTS IRP диспетчера PnP. В зависимости от архитектуры оборудования HAL может назначать ресурсы ввода-вывода в пространстве ввода-вывода или в пространстве памяти, а также может назначать ресурсы памяти в пространстве ввода-вывода или в пространстве памяти.
Если HAL использует пространство памяти относительно шины для доступа к ресурсам устройства (например, регистрам устройств), драйвер должен сопоставить пространство ввода-вывода с виртуальной памятью, чтобы он смог получить доступ к этим ресурсам. Драйвер может определить, являются ли ресурсы для операций ввода-вывода или памяти, проверяя переведенные ресурсы, переданные драйверу диспетчером PnP при запуске устройства. Если HAL использует пространство ввода-вывода, сопоставление не требуется.
В частности, когда драйвер получает запрос IRP_MN_START_DEVICE, он должен изучить структуры В IrpSp-Parameters.StartDevice.AllocatedResources> и IrpSp-Parameters.StartDevice.AllocatedResourcesTranslated>, которые описывают необработанные (относительно шины) и переведенные ресурсы соответственно, которые диспетчер PnP назначил устройству. Драйверы должны сохранять копию каждого списка ресурсов в расширении устройства в качестве вспомогательного средства для отладки.
Списки ресурсов являются парными CM_RESOURCE_LIST структурами, в которых каждый элемент необработанного списка соответствует одному и тому же элементу переведенного списка. Например, если AllocatedResources.List[0] описывает необработанный диапазон портов ввода-вывода, то AllocatedResourcesTranslated.List[0] описывает тот же диапазон после преобразования. Каждый переведенный ресурс включает физический адрес и тип ресурса.
Если драйверу назначен преобразованный ресурс памяти (CmResourceTypeMemory), он должен вызвать MmMapIoSpace , чтобы сопоставить физический адрес с виртуальным адресом, по которому он может получить доступ к регистрам устройств. Чтобы драйвер работал независимо от платформы, он должен проверка каждый возвращенный переведенный ресурс и при необходимости сопоставить его.
Драйвер в режиме ядра должен выполнить следующие действия в ответ на запрос IRP_MN_START_DEVICE, чтобы обеспечить доступ ко всем ресурсам устройства.
Скопируйте IrpSp-Parameters.StartDevice.AllocatedResources> в расширение устройства.
Скопируйте IrpSp-Parameters.StartDevice.AllocatedResourcesTranslated> в расширение устройства.
В цикле проверьте каждый элемент дескриптора в AllocatedResourcesTranslated. Если тип ресурса дескриптора — CmResourceTypeMemory, вызовите MmMapIoSpace, передав физический адрес и длину преобразованного ресурса.
Когда драйвер получает запрос IRP_MN_STOP_DEVICE или IRP_MN_REMOVE_DEVICE от диспетчера PnP, он должен освободить сопоставления, вызвав MmUnmapIoSpace в аналогичном цикле. Драйвер также должен вызвать MmUnmapIoSpace , если он должен завершиться сбоем запроса IRP_MN_START_DEVICE .
Тип необработанного ресурса указывает, какую подпрограмму доступа HAL должен вызывать драйвер (READ_REGISTER_XXX, WRITE_REGISTER_XXX, READ_PORT_XXX, WRITE_PORT_XXX). Большинству драйверов не нужно проверка список необработанных ресурсов, чтобы определить, какую из этих подпрограмм использовать, так как драйвер сам запрашивал ресурс или модуль записи драйверов знает требуемый тип, учитывая характер оборудования устройства.
Для ресурса в пространстве ввода-вывода (CmResourceTypePort, CmResourceTypeInterrupt, CmResourceTypeDma) драйвер должен использовать 32 бита возвращенного физического адреса для доступа к ресурсу устройства, например с помощью READ_REGISTER_XXX, WRITE_REGISTER_XXX, READ_PORT_XXX, WRITE_PORT_XXX.