Udostępnij przez


Mapowanie adresów Bus-Relative na adresy wirtualne

Niektóre procesory implementują oddzielne przestrzenie adresowe pamięci i we/wy, podczas gdy inne procesory nie. Ze względu na te różnice w platformach sprzętowych mechanizmy używane przez sterowniki do uzyskiwania dostępu do zasobów urządzeń wejścia/wyjścia lub pamięci różnią się w zależności od platformy.

Sterownik żąda zasobów we/wy i pamięci urządzenia w odpowiedzi na IRP IRP_MN_QUERY_RESOURCE_REQUIREMENTS menedżera PnP. W zależności od architektury sprzętu HAL może przypisywać zasoby we/wy w przestrzeni we/wy lub w przestrzeni pamięci oraz przypisywać zasoby pamięci w przestrzeni we/wy lub w przestrzeni pamięci.

Jeśli HAL używa przestrzeni pamięci względnej magistrali do uzyskiwania dostępu do zasobów urządzenia (takich jak rejestry urządzeń), sterownik musi mapować przestrzeń I/O na pamięć wirtualną, aby móc uzyskać dostęp do tych zasobów. Sterownik może określić, czy zasoby pochodzą z wejścia-wyjścia czy pamięci, analizując przetłumaczone zasoby przekazane do sterownika przez menedżera PnP podczas uruchamiania urządzenia. Jeśli HAL używa miejsca I/O, nie jest wymagane mapowanie.

W szczególności, gdy sterownik odbiera żądanie IRP_MN_START_DEVICE, powinien zbadać struktury w IrpSp-Parameters.StartDevice.AllocatedResources> i IrpSp-Parameters.StartDevice.AllocatedResourcesTranslated>, które opisują surowe (względne magistrali) i przetłumaczone zasoby, odpowiednio przypisane do urządzenia przez menedżera PnP. Sterowniki powinny zapisywać kopię każdej listy zasobów w rozszerzeniu urządzenia jako pomoc do debugowania.

Listy zasobów są połączone CM_RESOURCE_LIST struktury, w których każdy element surowej listy odpowiada temu samemu elementowi przetłumaczonej listy. Jeśli na przykład AllocatedResources.List[0] opisuje nieprzetworzony zakres portów wejścia/wyjścia, AllocatedResourcesTranslated.List[0] opisuje ten sam zakres po tłumaczeniu. Każdy przetłumaczony zasób zawiera adres fizyczny i typ zasobu.

Jeśli sterownik ma przypisany przetłumaczony zasób pamięci (CmResourceTypeMemory), musi wywołać element MmMapIoSpace , aby zamapować adres fizyczny na adres wirtualny, za pomocą którego może uzyskiwać dostęp do rejestrów urządzeń. Aby sterownik działał w sposób niezależny od platformy, powinien sprawdzać każdy zwrócony, przetłumaczony zasób i mapować go w razie potrzeby.

Sterownik trybu jądra powinien wykonać następujące czynności w odpowiedzi na żądanie IRP_MN_START_DEVICE, aby zapewnić dostęp do wszystkich zasobów urządzenia

  1. Skopiuj IrpSp-Parameters.StartDevice.AllocatedResources> do rozszerzenia urządzenia.

  2. Skopiuj IrpSp-Parameters.StartDevice.AllocatedResourcesTranslated> do rozszerzenia urządzenia.

  3. W pętli skontroluj każdy element deskryptora w AllocatedResourcesTranslated. Jeśli typ zasobu deskryptora to CmResourceTypeMemory, wywołaj metodę MmMapIoSpace, przekazując adres fizyczny i długość przetłumaczonego zasobu.

Gdy sterownik odbiera żądanie IRP_MN_STOP_DEVICE lub IRP_MN_REMOVE_DEVICE od menedżera PnP, musi zwolnić mapowania, wywołując element MmUnmapIoSpace w podobnej pętli. Sterownik powinien również wywołać polecenie MmUnmapIoSpace , jeśli musi zakończyć się niepowodzeniem żądania IRP_MN_START_DEVICE .

Typ zasobu pierwotnego wskazuje, która procedura dostępu HAL powinna wywołać sterownik (READ_REGISTER_XXX, WRITE_REGISTER_XXX, READ_PORT_XXX, WRITE_PORT_XXX). Większość sterowników nie musi sprawdzać nieprzetworzonej listy zasobów, aby określić, które z tych procedur należy użyć, ponieważ sam sterownik zażądał zasobu lub moduł zapisywania sterowników zna wymagany typ, biorąc pod uwagę charakter sprzętu urządzenia.

W przypadku zasobu w przestrzeni we/wy (CmResourceTypePort, CmResourceTypeInterrupt, CmResourceTypeDma) sterownik powinien używać niższe 32 bity zwracanego adresu fizycznego, aby uzyskać dostęp do zasobu urządzenia, na przykład za pomocą rutyn odczytu i zapisu HAL: READ_REGISTER_XXX, WRITE_REGISTER_XXX, READ_PORT_XXX, WRITE_PORT_XXX.