Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
Skopiuj IrpSp-Parameters.StartDevice.AllocatedResources> do rozszerzenia urządzenia.
Skopiuj IrpSp-Parameters.StartDevice.AllocatedResourcesTranslated> do rozszerzenia urządzenia.
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.