Nodos de dispositivo y pilas de dispositivos
En Windows, los dispositivos se representan mediante nodos de dispositivo en el árbol de dispositivos Plug and Play (PnP). Normalmente, cuando se envía una solicitud de E/S a un dispositivo, varios controladores ayudan a controlar la solicitud. Cada uno de estos controladores está asociado a un objeto de dispositivo y los objetos de dispositivo se organizan en una pila. La secuencia de objetos de dispositivo junto con sus controladores asociados se denomina pila de dispositivos. Cada nodo de dispositivo tiene su propia pila de dispositivos.
Nodos de dispositivo y árbol de dispositivos Plug and Play
Windows organiza los dispositivos en una estructura de árbol denominada árbol de dispositivos Plug and Play, o simplemente el árbol de dispositivos. Normalmente, un nodo del árbol de dispositivos representa un dispositivo o una función individual en un dispositivo compuesto. Sin embargo, algunos nodos representan componentes de software que no tienen ninguna asociación con dispositivos físicos.
Un nodo del árbol de dispositivos se denomina nodo de dispositivo. El nodo raíz del árbol de dispositivos se denomina nodo de dispositivo raíz. Por convención, el nodo del dispositivo raíz se dibuja en la parte inferior del árbol de dispositivos, como se muestra en el diagrama siguiente.
El árbol de dispositivos ilustra las relaciones primarias o secundarias inherentes al entorno PnP. Varios de los nodos del árbol de dispositivos representan buses que tienen dispositivos secundarios conectados a ellos. Por ejemplo, el nodo PCI Bus representa el bus PCI físico en la placa base. Durante el inicio, el administrador de PnP pide al controlador de bus PCI que enumere los dispositivos conectados al bus PCI. Esos dispositivos se representan mediante nodos secundarios del nodo PCI Bus. En el diagrama anterior, el nodo PCI Bus tiene nodos secundarios para varios dispositivos conectados al bus PCI, incluidos controladores de host USB, un controlador de audio y un puerto PCI Express.
Algunos de los dispositivos conectados al bus PCI son autobuses por sí mismos. El administrador de PnP pide a cada uno de estos buses que enumere los dispositivos que están conectados a él. En el diagrama anterior, podemos ver que el controlador de audio es un bus que tiene un dispositivo de audio conectado a él. Podemos ver que el puerto PCI Express es un bus que tiene un adaptador de pantalla conectado a él y el adaptador de pantalla es un bus que tiene un monitor conectado a él.
Tanto si piensa en un nodo como si representa un dispositivo o un bus depende del punto de vista. Por ejemplo, puede considerar el adaptador de pantalla como un dispositivo que desempeña un papel clave en la preparación de fotogramas que aparecen en la pantalla. Sin embargo, también puede considerar el adaptador de pantalla como un bus capaz de detectar y enumerar monitores conectados.
Objetos de dispositivo y pilas de dispositivos
Un objeto de dispositivo es una instancia de una estructura de DEVICE_OBJECT. Cada nodo de dispositivo del árbol de dispositivos PnP tiene una lista ordenada de objetos de dispositivo y cada uno de estos objetos de dispositivo está asociado a un controlador. La lista ordenada de objetos de dispositivo, junto con sus controladores asociados, se denomina pila de dispositivos para el nodo del dispositivo.
Puede pensar en una pila de dispositivos de varias maneras. En el sentido más formal, una pila de dispositivos es una lista ordenada de pares (objeto de dispositivo, controlador). Sin embargo, en determinados contextos puede resultar útil pensar en la pila de dispositivos como una lista ordenada de objetos de dispositivo. En otros contextos, puede resultar útil pensar en la pila de dispositivos como una lista ordenada de controladores.
Por convención, una pila de dispositivos tiene una parte superior e inferior. El primer objeto de dispositivo que se va a crear en la pila de dispositivos está en la parte inferior y el último objeto de dispositivo que se va a crear y asociar a la pila de dispositivos está en la parte superior.
En el diagrama siguiente, el nodo del dispositivo Gizmo de Proseware tiene una pila de dispositivos que contiene tres pares (objeto de dispositivo, controlador). El objeto de dispositivo superior está asociado al controlador AfterThought.sys, el objeto de dispositivo central está asociado al controlador Proseware.sys y el objeto de dispositivo inferior está asociado al controlador Pci.sys. El nodo PCI Bus en el centro del diagrama tiene una pila de dispositivos que contiene dos pares (objeto de dispositivo, controlador), un objeto de dispositivo asociado a Pci.sys y un objeto de dispositivo asociado a Acpi.sys.
¿Cómo se construye una pila de dispositivos?
Durante el inicio, el administrador de PnP pide al controlador que cada bus enumere los dispositivos secundarios que están conectados al bus. Por ejemplo, el administrador de PnP pide al controlador de bus PCI (Pci.sys) que enumere los dispositivos conectados al bus PCI. En respuesta a esta solicitud, Pci.sys crea un objeto de dispositivo para cada dispositivo conectado al bus PCI. Cada uno de estos objetos de dispositivo se denomina objeto de dispositivo físico (PDO). Poco después de Pci.sys crea el conjunto de PPO, el árbol del dispositivo es similar al que se muestra en el diagrama siguiente.
El administrador de PnP asocia un nodo de dispositivo a cada PDO recién creado y busca en el registro para determinar qué controladores deben formar parte de la pila de dispositivos para el nodo. La pila de dispositivos debe tener un controlador de función (y solo uno) y, opcionalmente, puede tener uno o varios controladores de filtro. El controlador de función es el controlador principal de la pila de dispositivos y es responsable de controlar las solicitudes de lectura, escritura y control de dispositivos. Los controladores de filtro desempeñan roles auxiliares en el procesamiento de solicitudes de control de lectura, escritura y dispositivo. A medida que se carga cada función y controlador de filtro, crea un objeto de dispositivo y se asocia a la pila de dispositivos. Un objeto de dispositivo creado por el controlador de funciones se denomina objeto de dispositivo funcional (FDO) y un objeto de dispositivo creado por un controlador de filtro se denomina objeto de dispositivo de filtro (Filter DO). Ahora el árbol de dispositivos tiene un aspecto similar al de este diagrama.
En el diagrama, observe que en un nodo, el controlador de filtro está por encima del controlador de función y, en el otro nodo, el controlador de filtro está debajo del controlador de función. Un controlador de filtro situado encima del controlador de función de una pila de dispositivos se denomina controlador de filtro superior. Un controlador de filtro que está debajo del controlador de función se denomina controlador de filtro inferior.
El PDO es siempre el objeto de dispositivo inferior de una pila de dispositivos. Esto resulta de la forma en que se construye una pila de dispositivos. El PDO se crea primero y, a medida que se adjuntan objetos de dispositivo adicionales a la pila, se adjuntan a la parte superior de la pila existente.
Nota Cuando se instalan los controladores de un dispositivo, el instalador usa información en un archivo de información (INF) para determinar qué controlador es el controlador de función y qué controladores son filtros. Normalmente, Microsoft o el proveedor de hardware proporcionan el archivo INF. Una vez instalados los controladores de un dispositivo, el administrador de PnP puede determinar la función y filtrar los controladores del dispositivo mediante la búsqueda en el Registro.
Conductores de autobús
En el diagrama anterior, puede ver que el controlador Pci.sys desempeña dos roles. En primer lugar, Pci.sys está asociado al FDO en el nodo del dispositivo PCI Bus. De hecho, creó el FDO en el nodo del dispositivo PCI Bus. Por lo tanto, Pci.sys es el controlador de función del bus PCI. En segundo lugar, Pci.sys está asociado al PDO en cada elemento secundario del nodo PCI Bus. Recuerde que creó los PPO para los dispositivos secundarios. El controlador que crea el PDO para un nodo de dispositivo se denomina controlador de bus para el nodo.
Si el punto de referencia es el bus PCI, Pci.sys es el controlador de función. Pero si el punto de referencia es el dispositivo Gizmo de Proseware, Pci.sys es el controlador de autobús. Este doble rol es típico en el árbol de dispositivos PnP. Un controlador que actúa como controlador de funciones para un autobús también sirve como controlador de autobús para un dispositivo secundario del autobús.
Pilas de dispositivos en modo de usuario
Hasta ahora hemos estado discutiendo las pilas de dispositivos en modo kernel. Es decir, los controladores de las pilas se ejecutan en modo kernel y los objetos de dispositivo se asignan al espacio del sistema, que es el espacio de direcciones que solo está disponible para el código que se ejecuta en modo kernel. Para obtener información sobre la diferencia entre el modo kernel y el modo de usuario, consulte Modo de usuario y modo kernel.
En algunos casos, un dispositivo tiene una pila de dispositivos en modo de usuario además de su pila de dispositivos en modo kernel. Los controladores en modo de usuario suelen basarse en el marco de controladores del modo de usuario (UMDF), que es uno de los modelos de controladores proporcionados por windows Driver Frameworks (WDF). En UMDF, los controladores son archivos DLL en modo de usuario y los objetos del dispositivo son objetos COM que implementan la interfaz IWDFDevice. Un objeto de dispositivo en una pila de dispositivos UMDF se denomina objeto de dispositivo WDF (WDF DO).
En el diagrama siguiente se muestra el nodo del dispositivo, la pila de dispositivos en modo kernel y la pila de dispositivos en modo de usuario para un dispositivo USB-FX-2. Los controladores de las pilas de modo de usuario y modo kernel participan en solicitudes de E/S dirigidas al dispositivo USB-FX-2.