Acceso al espacio de configuración de dispositivos PCI
Algunas operaciones en un dispositivo de interconexión de componentes periféricos (PCI) están reservadas para el controlador de funciones del dispositivo. Estas operaciones incluyen, por ejemplo, el acceso al espacio de configuración específico del dispositivo de un bus y la programación de un controlador de acceso directo a memoria (DMA). Microsoft proporciona compatibilidad con el sistema para acceder al espacio de configuración de los dispositivos PCI mediante dos métodos:
Interfaz de bus BUS_INTERFACE_STANDARD
Paquetes de solicitud de E/S de configuración (IRP), IRP_MN_READ_CONFIG y IRP_MN_WRITE_CONFIG
Nota
A partir de Windows 10, versión 2004, si un dispositivo tiene una tabla ACPI de dispositivos seguros (SDEV) y la seguridad basada en virtualización habilitada, las restricciones se colocan en métodos no admitidos para acceder al espacio de configuración del dispositivo PCI. Si un controlador o proceso intenta leer o manipular el espacio de configuración del dispositivo PCI mediante un método que no aparece anteriormente, el acceso se bloqueará y dará como resultado una comprobación de errores del sistema.
Los sistemas operativos Windows XP y Windows Server 2003 y versiones posteriores tienen un control exclusivo sobre el encabezado del espacio de configuración, tal como se define en la especificación de PCI Local Bus , así como todas las funcionalidades de la lista de funcionalidades vinculadas. Los controladores no deben intentar modificar estos registros.
Sin embargo, los controladores pueden escribir en el espacio de configuración que no pertenece al encabezado o a la lista de funcionalidades definida por el proveedor, mediante la solicitud IRP_MN_WRITE_CONFIG o el método SetBusData de BUS_INTERFACE_STANDARD. Los controladores también pueden leer las funcionalidades de un dispositivo, mediante la solicitud IRP_MN_READ_CONFIG o el método GetBusData de BUS_INTERFACE_STANDARD. Para usar IRP_MN_READ_CONFIG o IRP_MN_WRITE_CONFIG, los controladores deben ejecutarse en PASSIVE_LEVEL. Para obtener una lista de las funcionalidades y las estructuras correspondientes que los controladores pueden consultar, consulte la sección Estructuras pci .
Los controladores pueden leer desde el espacio de configuración extendido del dispositivo PCI (es decir, más de 256 bytes de datos de configuración) mediante la solicitud IRP_MN_READ_CONFIG o el método GetBusData de BUS_INTERFACE_STANDARD. Del mismo modo, los controladores pueden escribir en el espacio de configuración del dispositivo PCI extendido mediante la solicitud IRP_MN_WRITE_CONFIG o el método SetBusData de BUS_INTERFACE_STANDARD. Si un dispositivo no tiene un espacio de configuración extendido o la plataforma no define una ruta de acceso para un espacio de configuración extendido en un dispositivo, las solicitudes de lectura devolverán 0xFFFF y las solicitudes de escritura no tendrán ningún efecto. Para determinar si la operación se realizó correctamente, los controladores pueden examinar el número de bytes leídos o escritos.
El modo PCI Express y PCI-X 2 admiten un espacio de configuración de dispositivo PCI extendido de más de 256 bytes. Los controladores pueden leer y escribir en este espacio de configuración, pero solo con la compatibilidad adecuada con hardware y BIOS. Dentro del BIOS ACPI, el bus raíz debe tener un identificador PNP de PNP0A08 o PNP0A03. En el caso de los buses raíz con el identificador PNP de PNP0A03, el método _DSM con la función 4 debe indicar que el modo actual es el modo PCI-X 2. Todos los puentes y dispositivos deben ser PCI Express o funcionar en modo PCI-X 2.
Además, el sistema debe admitir el acceso al espacio de configuración asignado a memoria. Esto se debe a definir una tabla MCFG en el BIOS/firmware del sistema. Los sistemas operativos Windows Vista y Windows Server 2008 y versiones posteriores admiten automáticamente el acceso al espacio de configuración asignado a memoria.
Advertencia
HalGetBusDataByOffset y HalSetBusDataByOffset se proporcionan para la compatibilidad con versiones anteriores, pero solo se deben usar si no es posible usar los dos métodos anteriores.