Nodi del dispositivo e stack di dispositivi

In Windows i dispositivi sono rappresentati dai nodi del dispositivo nell'albero dei dispositivi Plug and Play (PnP). In genere, quando viene inviata una richiesta di I/O a un dispositivo, diversi driver consentono di gestire la richiesta. Ognuno di questi driver è associato a un oggetto dispositivo e gli oggetti dispositivo vengono disposti in uno stack. La sequenza di oggetti dispositivo insieme ai driver associati è denominata stack di dispositivi. Ogni nodo del dispositivo ha un proprio stack di dispositivi.

Nodi del dispositivo e albero dei dispositivi Plug and Play

Windows organizza i dispositivi in una struttura ad albero denominata albero dei dispositivi Plug and Play o semplicemente l'albero dei dispositivi. In genere, un nodo nell'albero dei dispositivi rappresenta un dispositivo o una singola funzione in un dispositivo composito. Tuttavia, alcuni nodi rappresentano componenti software che non hanno alcuna associazione con i dispositivi fisici.

Un nodo nell'albero dei dispositivi è denominato nodo del dispositivo. Il nodo radice dell'albero dei dispositivi viene chiamato nodo del dispositivo radice. Per convenzione, il nodo del dispositivo radice viene disegnato nella parte inferiore dell'albero dei dispositivi, come illustrato nel diagramma seguente.

diagramma dell'albero dei dispositivi, che mostra i nodi del dispositivo.

L'albero dei dispositivi illustra le relazioni padre/figlio intrinseche nell'ambiente PnP. Diversi nodi nell'albero dei dispositivi rappresentano bus con dispositivi figlio connessi. Ad esempio, il nodo bus PCI rappresenta il bus PCI fisico sulla scheda madre. Durante l'avvio, il gestore PnP chiede al driver del bus PCI di enumerare i dispositivi connessi al bus PCI. Tali dispositivi sono rappresentati dai nodi figlio del nodo del bus PCI. Nel diagramma precedente, il nodo bus PCI include nodi figlio per diversi dispositivi connessi al bus PCI, inclusi i controller host USB, un controller audio e una porta PCI Express.

Alcuni dei dispositivi connessi al bus PCI sono gli autobus stessi. Il responsabile PnP chiede a ognuno di questi autobus di enumerare i dispositivi connessi. Nel diagramma precedente è possibile notare che il controller audio è un bus con un dispositivo audio connesso. Si può notare che la porta PCI Express è un bus con una scheda di visualizzazione connessa e la scheda di visualizzazione è un bus con un monitor collegato.

Indipendentemente dal fatto che un nodo rappresenti un dispositivo o un bus dipende dal punto di vista. Ad esempio, è possibile considerare la scheda di visualizzazione come un dispositivo che svolge un ruolo chiave nella preparazione dei fotogrammi visualizzati sullo schermo. Tuttavia, è anche possibile considerare la scheda di visualizzazione come un bus in grado di rilevare ed enumerare i monitor connessi.

Oggetti dispositivo e stack di dispositivi

Un oggetto dispositivo è un'istanza di una struttura DEVICE_OBJECT . Ogni nodo del dispositivo nell'albero dei dispositivi PnP ha un elenco ordinato di oggetti dispositivo e ognuno di questi oggetti dispositivo è associato a un driver. L'elenco ordinato di oggetti dispositivo, insieme ai driver associati, viene chiamato stack di dispositivi per il nodo del dispositivo.

È possibile pensare a uno stack di dispositivi in diversi modi. Nel senso più formale, uno stack di dispositivi è un elenco ordinato di coppie (oggetto dispositivo, driver). Tuttavia, in determinati contesti può essere utile considerare lo stack di dispositivi come un elenco ordinato di oggetti dispositivo. In altri contesti, potrebbe essere utile considerare lo stack di dispositivi come un elenco ordinato di driver.

Per convenzione, uno stack di dispositivi ha una parte superiore e una inferiore. Il primo oggetto dispositivo da creare nello stack di dispositivi si trova nella parte inferiore e l'ultimo oggetto dispositivo da creare e collegato allo stack di dispositivi si trova nella parte superiore.

Nel diagramma seguente il nodo del dispositivo Proseware Gizmo ha uno stack di dispositivi che contiene tre coppie (oggetto dispositivo, driver). L'oggetto dispositivo superiore è associato al driver AfterThought.sys, l'oggetto dispositivo centrale è associato al driver Proseware.sys e l'oggetto dispositivo inferiore è associato al driver Pci.sys. Il nodo bus PCI al centro del diagramma ha uno stack di dispositivi che contiene due coppie (oggetto dispositivo, driver), ovvero un oggetto dispositivo associato a Pci.sys e un oggetto dispositivo associato a Acpi.sys.

Diagramma che mostra gli oggetti dispositivo ordinati in stack di dispositivi nei nodi del dispositivo gizmo e pci proseware.

Come viene costruito uno stack di dispositivi?

Durante l'avvio, il gestore PnP chiede al driver di ogni bus di enumerare i dispositivi figlio connessi al bus. Ad esempio, il gestore PnP chiede al driver del bus PCI (Pci.sys) di enumerare i dispositivi connessi al bus PCI. In risposta a questa richiesta, Pci.sys crea un oggetto dispositivo per ogni dispositivo connesso al bus PCI. Ognuno di questi oggetti dispositivo è denominato oggetto dispositivo fisico (PDO). Poco dopo Pci.sys crea il set di PDO, l'albero dei dispositivi è simile a quello illustrato nel diagramma seguente.

diagramma degli oggetti nodo pci e dispositivo fisico per i dispositivi figlio.

Il gestore PnP associa un nodo del dispositivo a ogni pdo appena creato e cerca nel Registro di sistema per determinare quali driver devono far parte dello stack di dispositivi per il nodo. Lo stack di dispositivi deve avere un solo driver di funzione (e uno) e può facoltativamente avere uno o più driver di filtro. Il driver di funzione è il driver principale per lo stack di dispositivi ed è responsabile della gestione delle richieste di lettura, scrittura e controllo del dispositivo. I driver di filtro svolgono ruoli ausiliari nell'elaborazione delle richieste di lettura, scrittura e controllo del dispositivo. Quando ogni funzione e driver di filtro viene caricato, crea un oggetto dispositivo e si collega allo stack di dispositivi. Un oggetto dispositivo creato dal driver di funzione è denominato oggetto dispositivo funzionale (FDO) e un oggetto dispositivo creato da un driver di filtro è denominato oggetto dispositivo filtro (Filter DO). Ora l'albero dei dispositivi ha un aspetto simile a questo diagramma.

diagramma di un albero del dispositivo che mostra gli oggetti filtro, funzione e dispositivo fisico nel nodo del dispositivo gizmo proseware.

Nel diagramma si noti che in un nodo il driver di filtro è al di sopra del driver di funzione e nell'altro nodo il driver di filtro si trova sotto il driver di funzione. Un driver di filtro che si trova sopra il driver di funzione in uno stack di dispositivi è denominato driver di filtro superiore. Un driver di filtro che si trova sotto il driver di funzione viene chiamato driver di filtro inferiore.

Il PDO è sempre l'oggetto dispositivo inferiore in uno stack di dispositivi. Questo risultato deriva dal modo in cui viene costruito uno stack di dispositivi. Il PDO viene creato per primo e, man mano che altri oggetti dispositivo vengono collegati allo stack, vengono collegati alla parte superiore dello stack esistente.

Nota Quando vengono installati i driver per un dispositivo, il programma di installazione usa le informazioni in un file di informazioni (INF) per determinare quale driver è il driver di funzione e quali driver sono filtri. In genere il file INF viene fornito da Microsoft o dal fornitore dell'hardware. Dopo aver installato i driver per un dispositivo, il gestore PnP può determinare la funzione e filtrare i driver per il dispositivo cercando nel Registro di sistema.

Conducenti di autobus

Nel diagramma precedente è possibile notare che il driver Pci.sys svolge due ruoli. Prima di tutto, Pci.sys è associato all'oggetto FDO nel nodo del dispositivo del bus PCI. In realtà, ha creato il fdO nel nodo del dispositivo PCI Bus. Quindi Pci.sys è il driver di funzione per il bus PCI. In secondo luogo, Pci.sys è associato al PDO in ogni elemento figlio del nodo del bus PCI. Tenere presente che ha creato i PDO per i dispositivi figlio. Il driver che crea il PDO per un nodo del dispositivo viene chiamato driver del bus per il nodo.

Se il punto di riferimento è il bus PCI, Pci.sys è il driver di funzione. Ma se il punto di riferimento è il dispositivo Proseware Gizmo, Pci.sys è l'autista dell'autobus. Questo doppio ruolo è tipico nell'albero dei dispositivi PnP. Un driver che funge da driver di funzione per un bus funge anche da autista di bus per un dispositivo figlio del bus.

Stack di dispositivi in modalità utente

Finora abbiamo discusso degli stack di dispositivi in modalità kernel. Ovvero, i driver negli stack vengono eseguiti in modalità kernel e gli oggetti dispositivo vengono mappati nello spazio di sistema, ovvero lo spazio indirizzi disponibile solo per il codice in esecuzione in modalità kernel. Per informazioni sulla differenza tra la modalità kernel e la modalità utente, vedere Modalità utente e modalità kernel.

In alcuni casi, un dispositivo ha uno stack di dispositivi in modalità utente oltre al relativo stack di dispositivi in modalità kernel. I driver in modalità utente sono spesso basati su User-Mode Driver Framework (UMDF), uno dei modelli di driver forniti da Windows Driver Framework (WDF). In UMDF i driver sono DLL in modalità utente e gli oggetti dispositivo sono oggetti COM che implementano l'interfaccia IWDFDevice. Un oggetto dispositivo in uno stack di dispositivi UMDF è denominato oggetto dispositivo WDF (WDF DO).

Il diagramma seguente mostra il nodo del dispositivo, lo stack di dispositivi in modalità kernel e lo stack di dispositivi in modalità utente per un dispositivo USB-FX-2. I driver nello stack sia in modalità utente che in modalità kernel partecipano alle richieste di I/O indirizzate al dispositivo USB-FX-2.

diagramma che mostra gli stack di dispositivi in modalità utente e in modalità kernel.

Concetti per tutti gli sviluppatori di driver

Stack di driver