Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
No Windows, os dispositivos são representados por nós de dispositivo na árvore de dispositivos Plug and Play (PnP). Normalmente, quando uma solicitação de E/S é enviada para um dispositivo, vários drivers ajudam a lidar com a solicitação. Cada um desses drivers está associado a um objeto de dispositivo, e os objetos de dispositivo são organizados numa pilha. A sequência de objetos de dispositivo juntamente com seus drivers associados é chamada de pilha de dispositivos. Cada nó de dispositivo tem a sua própria pilha de dispositivos.
Nódos de dispositivos e a árvore de dispositivos Plug and Play
O Windows organiza dispositivos em uma estrutura de árvore chamada árvore de dispositivos Plug and Play, ou simplesmente a árvore de dispositivos . Normalmente, um nó na árvore de dispositivos representa um dispositivo ou uma função individual num dispositivo composto. No entanto, alguns nós representam componentes de software que não têm associação com dispositivos físicos.
Um nó na árvore de dispositivos é referido como nó de dispositivo . O nó raiz da árvore de dispositivos é chamado de nó raiz do dispositivo . Por convenção, o nó do dispositivo raiz é desenhado na parte inferior da árvore do dispositivo, conforme mostrado no diagrama a seguir.
A árvore de dispositivos ilustra as relações pai/filho que são inerentes ao ambiente PnP. Vários dos nós na árvore de dispositivos representam barramentos que têm dispositivos secundários conectados a eles. Por exemplo, o nó PCI Bus representa o barramento PCI físico na placa-mãe. Durante a inicialização, o gerenciador PnP pede ao driver de barramento PCI para enumerar os dispositivos que estão conectados ao barramento PCI. Esses dispositivos são representados por nós filhos do nó do barramento PCI. No diagrama anterior, o nó do Barramento PCI possui nós filhos para vários dispositivos conectados ao barramento PCI, incluindo controladores de anfitrião USB, um controlador de áudio e uma porta PCI Express.
Alguns dos dispositivos conectados ao barramento PCI são barramentos próprios. O gestor PnP pede a cada um desses buses para enumerar os dispositivos que lhes estão ligados. No diagrama anterior, podemos ver que o controlador de áudio funciona como uma bus, à qual está conectado um dispositivo de áudio. Podemos ver que a porta PCI Express é um barramento ao qual está conectado um adaptador de vídeo, e este adaptador de vídeo, por sua vez, é um barramento ao qual está conectado um monitor.
Se pensares num nó como a representação de um dispositivo ou de um barramento, isso depende da perspetiva. Por exemplo, você pode pensar no adaptador de vídeo como um dispositivo que desempenha um papel fundamental na preparação de quadros que aparecem na tela. No entanto, também pode considerar o adaptador de vídeo como um barramento capaz de detetar e enumerar ecrãs conectados.
Objetos de dispositivo e pilhas de dispositivos
Um objeto de dispositivo é uma instância de uma estrutura DEVICE_OBJECT. Cada nó de dispositivo na árvore de dispositivos PnP tem uma lista ordenada de objetos de dispositivo e cada um desses objetos de dispositivo está associado a um driver. A lista ordenada de objetos de dispositivo, juntamente com seus drivers associados, é chamada de de pilha de dispositivos para o nó do dispositivo.
Você pode pensar em uma pilha de dispositivos de várias maneiras. No sentido mais formal, uma pilha de dispositivos é uma lista ordenada de pares (objeto de dispositivo, driver). No entanto, em certos contextos, pode ser útil pensar na pilha de dispositivos como uma lista ordenada de objetos de dispositivo. Em outros contextos, pode ser útil pensar na pilha de dispositivos como uma lista ordenada de controladores.
Por convenção, uma pilha de dispositivos tem uma parte superior e uma inferior. O primeiro objeto de dispositivo a ser criado na pilha de dispositivos está na parte inferior, e o último objeto de dispositivo a ser criado e anexado à pilha de dispositivos está na parte superior.
No diagrama a seguir, o nó do dispositivo Proseware Gizmo tem uma pilha de dispositivos que contém três pares (objeto de dispositivo, driver). O objeto de dispositivo superior está associado ao driver AfterThought.sys, o objeto de dispositivo do meio está associado ao driver Proseware.syse o objeto de dispositivo inferior está associado ao driver Pci.sys. O nó Barramento PCI no centro do diagrama tem uma pilha de dispositivos que contém dois pares de (objeto de dispositivo e driver): um objeto de dispositivo associado a Pci.sys e um objeto de dispositivo associado a Acpi.sys.
Como é construída uma pilha de dispositivos?
Durante a inicialização, o gestor PnP solicita ao driver de cada barramento para listar dispositivos-filho que estão conectados ao barramento. Por exemplo, o gerenciador PnP pede ao driver de barramento PCI (Pci.sys) para enumerar os dispositivos que estão conectados ao barramento PCI. Em resposta a essa solicitação, Pci.sys cria um objeto de dispositivo para cada dispositivo conectado ao barramento PCI. Cada um desses objetos de dispositivo é chamado de objeto de dispositivo físico (DOP). Logo após Pci.sys criar o conjunto de DOPs, a árvore do dispositivo parece-se com a mostrada a seguir no diagrama.
O gestor PnP associa um nó de dispositivo a cada PDO recém-criado e consulta o registo para determinar quais drivers precisam fazer parte da pilha de dispositivos para o nó. A pilha de dispositivos deve ter um (e apenas um) driver de função e pode, opcionalmente, ter um ou mais drivers de filtro . O driver de função é o driver principal para o stack de dispositivos e é responsável por processar solicitações de leitura, gravação e controlo do dispositivo. Os drivers de filtro desempenham funções auxiliares no processamento de solicitações de leitura, gravação e controle de dispositivos. À medida que cada driver de função e filtro é carregado, ele cria um objeto de dispositivo e conecta-se à pilha de dispositivos. Um objeto de dispositivo criado pelo driver de função é chamado de FDO ( de objeto de dispositivo funcional) e um objeto de dispositivo criado por um driver de filtro é chamado de de objeto de dispositivo de filtro de (Filter DO). Agora, a árvore de dispositivos se parece com este diagrama.
No diagrama, observe que em um nó, o driver de filtro está acima do driver de função e, no outro nó, o driver de filtro está abaixo do driver de função. Um driver de filtro que está acima do driver funcional em uma pilha de dispositivos é chamado de driver de filtro superior . Um driver de filtro que está abaixo do driver de função é chamado de driver de filtro inferior .
O PDO é sempre o objeto de dispositivo inferior numa pilha de dispositivos. Isso resulta da maneira como é estruturada uma pilha de dispositivos. O PDO é criado primeiro e, à medida que objetos de dispositivo adicionais são anexados à pilha, eles são anexados no topo da pilha existente.
Nota Quando os drivers para um dispositivo são instalados, o instalador usa informações em um arquivo de informações (INF) para determinar qual driver é o driver de função e quais drivers são filtros. Normalmente, o arquivo INF é fornecido pela Microsoft ou pelo fornecedor de hardware. Depois de instalados os drivers para um dispositivo, o gestor PnP pode determinar os drivers de função e de filtro para o dispositivo, consultando o registo.
Motoristas de ônibus
No diagrama anterior, você pode ver que o driver Pci.sys desempenha duas funções. Primeiro, Pci.sys está associado ao FDO no nó do dispositivo PCI Bus. Na verdade, ele criou o FDO no nó do dispositivo PCI Bus. Então Pci.sys é o driver de função para o barramento PCI. Em segundo lugar, Pci.sys está associado ao PDO em cada filho do nó PCI Bus. Lembre-se de que ele criou os PDOs para os dispositivos filho. O driver que cria o PDO para um nó de dispositivo é chamado de driver de barramento para o nó.
Se o ponto de referência for o barramento PCI, então Pci.sys é o driver da função. Mas se o seu ponto de referência é o dispositivo Proseware Gizmo, então Pci.sys é o motorista do ônibus. Essa função dupla é típica na árvore de dispositivos PnP. Um motorista que serve como motorista de função para um ônibus também serve como motorista de ônibus para um dispositivo filho do ônibus.
Pilhas de dispositivos de modo de usuário
Até agora, temos discutido pilhas de dispositivos de modo kernel. Ou seja, os drivers nas pilhas são executados no modo núcleo, e os objetos do dispositivo são mapeados no espaço do sistema, que é o espaço de endereço que está disponível apenas para o código em execução no modo núcleo. Para obter informações sobre a diferença entre o modo kernel e o modo de usuário, consulte Modo de usuário e modo kernel.
Em alguns casos, um dispositivo tem uma pilha de dispositivos de modo de usuário, além de sua pilha de dispositivos de modo kernel. Os drivers de modo de usuário geralmente são baseados no User-Mode Driver Framework (UMDF), que é um dos modelos de driver fornecidos pelo Windows Driver Frameworks (WDF). No UMDF, os drivers são DLLs de modo de usuário e os objetos de dispositivo são objetos COM que implementam a interface IWDFDevice. Um objeto de dispositivo em uma pilha de dispositivos UMDF é chamado de objeto de dispositivo WDF (WDF DO).
O diagrama a seguir mostra o nó do dispositivo, a pilha de dispositivos do modo kernel e a pilha de dispositivos do modo do usuário para um dispositivo USB-FX-2. Os drivers nas pilhas de modo de usuário e modo kernel participam de solicitações de E/S direcionadas ao dispositivo USB-FX-2.