Introduzione alle risorse hardware
Le risorse hardware di un sistema sono le porte di I/O, i vettori di interrupt, i canali DMA (Direct Memory Access) e altri percorsi di comunicazione che devono essere assegnati a ogni dispositivo connesso al sistema. Gli argomenti di questa sezione descrivono in che modo i driver di Kernel-Mode Driver Framework (KMDF) negoziano i requisiti delle risorse hardware per un dispositivo, esaminano l'elenco di risorse proposto e ricevono le risorse assegnate. Questa sezione illustra anche come i driver kmdf e User-Mode Driver Framework (UMDF) accedono eseguono il mapping delle risorse assegnate.
Dopo che un utente collega un dispositivo PnP, il driver che enumera il dispositivo crea in genere una o più configurazioni logiche, ovvero combinazioni di risorse hardware che il dispositivo può usare. Le configurazioni comprendono:
Configurazione di avvio che elenca le risorse hardware richieste dal dispositivo all'avvio del sistema. Per i dispositivi PnP, queste informazioni vengono fornite dal BIOS.
Configurazioni aggiuntive in cui il dispositivo può funzionare. Il driver raggruppa queste configurazioni aggiuntive in un elenco dei requisiti delle risorse. Il gestore PnP selezionerà infine le risorse da questo elenco da assegnare al dispositivo.
Dopo che il driver crea le configurazioni logiche, le invia al framework e il framework le invia al gestore PnP.
Successivamente, il gestore PnP determina quali driver il dispositivo richiede e li carica se non sono già caricati. Il gestore PnP invia l'elenco dei requisiti hardware del dispositivo ai driver del dispositivo per la revisione. I driver di funzione e filtro possono modificare questo elenco e inviarlo di nuovo al gestore PnP.
Il gestore PnP esamina l'elenco dei requisiti hardware modificati e determina quale delle risorse specificate sono effettivamente disponibili nel sistema. Se il dispositivo richiede risorse assegnate in precedenza al gestore PnP a un altro dispositivo, il gestore PnP potrebbe tentare di ridistribuire le risorse tra i dispositivi del sistema.
Successivamente, il gestore PnP crea un elenco di risorse, ovvero un elenco di risorse che il manager PnP intende assegnare al dispositivo. Il gestore PnP invia questo elenco ai driver del dispositivo per la revisione. A questo punto, i driver di funzione e filtro possono rimuovere le risorse dall'elenco, ma non possono aggiungervi risorse.
Infine, il manager PnP assegna le risorse al dispositivo. Il framework passa l'elenco di risorse alla funzione e ai driver di filtro del dispositivo e il driver di funzione del dispositivo esegue qualsiasi inizializzazione necessaria in modo che il dispositivo e il driver possano accedere alle risorse.
I passaggi seguenti descrivono il processo in modo più dettagliato:
Un driver del bus rileva il dispositivo ed enumera il dispositivo.
Il framework chiama la funzione di callback EvtDeviceResourcesQuery del driver del bus, che crea un elenco di risorse che descrive la configurazione di avvio del dispositivo.
Il framework chiama la funzione di callback EvtDeviceResourceResourceRequirementsQuery del driver del bus, che crea un elenco di requisiti di risorse per il dispositivo.
Il gestore PnP determina quali driver il dispositivo richiede e li carica, se non sono già caricati, per creare uno stack di driver per il dispositivo.
Il gestore PnP invia l'elenco dei requisiti delle risorse del dispositivo allo stack di driver per la revisione. Quando l'elenco si sposta verso il basso nello stack di driver, il framework chiama ogni funzione e filtra la funzione di callback EvtDeviceFilterRemoveResourceRequirements . Quando l'elenco esegue il backup dello stack, il framework chiama ogni funzione e filtra la funzione di callback EvtDeviceFilterAddResourceRequirements del driver. Entrambe queste funzioni di callback possono modificare l'elenco dei requisiti delle risorse.
Il gestore PnP crea un elenco di risorse per il dispositivo e lo invia allo stack di driver per la revisione. Il framework chiama ogni funzione e la funzione di callback evtDeviceRemoveAddedResources del driver, che rimuove le risorse aggiunte dalla funzione di callback EvtDeviceFilterAddResourceRequirements del driver, in modo che il driver del bus non tenti di usarle.
Il framework riceve l'elenco di risorse finale dal gestore PnP e lo archivia.
Se un driver chiama WdfInterruptCreate per creare oggetti interrupt, il framework trova le risorse di interrupt nell'elenco di risorse e le assegna agli oggetti interrupt.
Dopo che il dispositivo ha immesso uno stato D0 non inizializzato, il framework chiama la funzione di callback EvtDevicePrepareHardware di ogni driver, passando le versioni non elaborate e tradotte dell'elenco di risorse del dispositivo come argomento di input. Il driver può salvare l'elenco di risorse, valido fino a quando il framework non chiama la funzione di callback EvtDeviceReleaseHardware del driver.