Skip to content
h0km4
Go back

Los registros de hardware controlan instrumentos modulares

Edit page

Introduccion

He/Hemos estado investigando unos temas particulares y creo que esta informacion puede servir de mucha ayuda si ustedes se encuentran con un problema similar, he leido muchos blogs y papers interesantes tratare de resumir un poco en este tema que considero el primer punto en nuestra investigacion. lets go…

Los registros de hardware controlan instrumentos modulares

A diferencia de los instrumentos de caja (benchtop), los instrumentos modulares se integran directamente en buses de entrada/salida de alta velocidad como PCIe. Esta diferencia arquitectónica elimina la necesidad de utilizar comandos SCPI (Standard Commands for Programmable Instruments), que son típicos en instrumentos conectados por GPIB, USB o Ethernet. En su lugar, los instrumentos modulares operan a un nivel mucho más cercano al hardware, donde el control se realiza directamente sobre registros de hardware expuestos por cada punto final PCIe (PCIe endpoint).

Dado que estándares como PXIe y AXIe están construidos sobre PCI Express, heredan su modelo de comunicación basado en memoria. Esto implica que cada operación de control, configuración o adquisición de datos no es más que una lectura o escritura sobre una dirección de memoria específica. Entender este modelo no solo es importante desde una perspectiva de desarrollo, sino también desde un punto de vista de rendimiento, depuración e incluso seguridad.

Para aprovechar completamente un instrumento PXIe o AXIe, es esencial comprender la cadena completa que existe entre el software de aplicación y el hardware físico. Esta cadena incluye controladores, capas del sistema operativo y mecanismos internos del bus PCIe.

Los registros de hardware no son accesibles directamente por las aplicaciones. En su lugar, se accede a ellos a través de módulos de software especializados llamados controladores (drivers), que abstraen la complejidad del hardware. Para estandarizar este acceso, la industria desarrolló las API de VISA (Virtual Instrument Software Architecture), que proporcionan funciones como viIn32 y viOut32 para leer y escribir registros.

Comprender cómo interactúan los controladores con los registros permite diseñar soluciones más eficientes, reducir la latencia de acceso y tener un control más preciso del comportamiento del instrumento. Este artículo describe cómo Windows, a través de su arquitectura interna, ejecuta estas operaciones sobre hardware PCIe utilizando las API VISA.

Arquitectura de software en Windows: modo usuario y modo kernel

El sistema operativo Windows implementa un modelo de ejecución basado en dos niveles de privilegio claramente diferenciados: modo usuario (User Mode) y modo kernel (Kernel Mode).

El modo usuario es un entorno restringido donde se ejecutan las aplicaciones convencionales. En este nivel, el acceso directo al hardware está completamente prohibido, lo que garantiza estabilidad y aislamiento entre procesos. Cualquier intento de acceder a recursos críticos debe pasar por mecanismos controlados del sistema operativo.

El modo kernel, por otro lado, tiene acceso total al hardware y a la memoria del sistema. Aquí es donde residen los controladores de dispositivos, el planificador del sistema y componentes críticos como el administrador de memoria.

Como se muestra a continuación, una aplicación en modo usuario interactúa con el hardware de forma indirecta, invocando APIs del subsistema de Windows, que a su vez se comunican con el administrador de E/S (I/O Manager) y los controladores en modo kernel.

user / kernel

La comunicación entre estas capas se realiza mediante estructuras llamadas IRP (I/O Request Packets). Un IRP representa una solicitud de operación de entrada/salida y viaja a través de la pila de controladores hasta que es procesado. A diferencia de las interrupciones de hardware, los IRP son completamente gestionados por software.

En la parte más baja de esta pila se encuentra el controlador de bus, que interactúa directamente con la HAL (Hardware Abstraction Layer). La HAL abstrae las diferencias entre plataformas de hardware, permitiendo que el sistema operativo sea portable y consistente.

El acceso a registros de hardware es una operación privilegiada, restringida exclusivamente al modo kernel. Cada dispositivo PCIe cuenta con su propio controlador, y únicamente este tiene permisos para acceder a sus registros internos.

Operaciones VISA

Dado que el acceso directo al hardware está restringido al modo kernel, la arquitectura VISA se construye como una pila híbrida que combina componentes en modo usuario y modo kernel.

En la capa superior se encuentra la aplicación del usuario, que puede ser software de pruebas personalizado, controladores IVI (Interchangeable Virtual Instrument) o interfaces gráficas como Soft Front Panels. Estas aplicaciones utilizan la API VISA sin preocuparse por los detalles de bajo nivel.

Las funciones viIn32 y viOut32 representan el punto de entrada para realizar operaciones sobre registros. Estas funciones requieren dos parámetros fundamentales:

Existen dos tipos principales de espacios accesibles:

Los BAR (Base Address Registers) son particularmente importantes, ya que definen las regiones de memoria que el sistema operativo asigna a cada dispositivo durante la fase de inicialización. Estos registros permiten traducir direcciones lógicas a direcciones físicas dentro del espacio MMIO.

El complemento VISA PXI actúa como intermediario, proporcionando APIs de más alto nivel como PpiOpen, PpiBlockRead o PpiBlockWrite. Internamente, estas funciones utilizan mecanismos del sistema como CreateFile y DeviceIoControl.

Cuando se invoca DeviceIoControl, el sistema genera un IRP de tipo IRP_MJ_DEVICE_CONTROL. Este IRP es procesado por el controlador del dispositivo mediante códigos IOCTL, que definen operaciones específicas.

Por ejemplo:

Dependiendo del tipo de operación, el controlador puede:

Mecanismo de acceso a registros

En arquitecturas PCIe, los dispositivos no se acceden mediante puertos de E/S tradicionales, sino a través de MMIO (Memory-Mapped I/O). Esto significa que el hardware se expone como regiones de memoria dentro del espacio de direcciones del sistema.

La dirección base MMIO es el punto de inicio de esta región. A partir de ella, es posible calcular la dirección de cualquier registro dentro de cualquier dispositivo PCIe.

El direccionamiento en PCIe sigue una estructura jerárquica basada en:

El primer dispositivo del sistema se encuentra en Bus 0, Dispositivo 0, Función 0. La fórmula para calcular la dirección de un registro es la siguiente:

Dirección del registro = MMIO_BASE + { bus[28:20], dispositivo[19:15], función[14:12] } + offset del registro

Este esquema permite direccionar de forma eficiente miles de dispositivos sin colisiones, utilizando un espacio de direcciones bien definido.

El offset representa la posición dentro del espacio de configuración extendido del dispositivo.

PCIe

Cada dispositivo dispone de 4 KB de espacio de configuración (0x000 a 0xFFF), donde se encuentran tanto registros estándar como registros específicos del fabricante.

Dirección base MMIO

La dirección base MMIO es el elemento más crítico de todo el modelo de acceso. Sin ella, no es posible resolver ninguna dirección de registro.

-----------------------------------------
BUSCAR TABLAS ACPI EN MEMORIA DEL BIOS
-----------------------------------------
                |
                |
-----------------------------------------
ENCONTRAR RSDP EN:
- BIOS ROM
- EBDA
-----------------------------------------
                |
                |
-----------------------------------------
OBTENER:
- VERSION ACPI
- TABLA RSDT / XSDT
-----------------------------------------
                |
                |
-------------------------
¿ACPI >= 2.0?
-------------------------
        |                     |
       SI                     NO
        |                     |
---------------------   ---------------------
USAR XSDT PARA        USAR RSDT PARA
TABLAS SECUNDARIAS    TABLAS SECUNDARIAS
---------------------   ---------------------
        |                     |
        -----------+----------
                    |
                    |
-----------------------------------------
LOCALIZAR TABLA MCFG
-----------------------------------------
                |
                |
-----------------------------------------
MMIO BASE ADDRESS:
OFFSET 44 EN MCFG
-----------------------------------------
                |
                |
-----------------------------------------
RESULTADO:
ACCESO A CONFIG SPACE PCIe
-----------------------------------------

El proceso para obtener esta dirección comienza en las estructuras ACPI del sistema. El punto de entrada es el RSDP (Root System Description Pointer), que se encuentra en regiones específicas de memoria del BIOS.

CampoTamaño (bytes)Descripción
Signature8Debe ser “RSD PTR ” (nota el espacio al final)
Checksum1Los primeros 20 bytes deben sumar 0 (interpretados como byte)
OEMID6Cadena proporcionada por el fabricante (OEM)
Revision1Versión de la estructura
ptrRSDT4Puntero de 32 bits a la tabla RSDT. Sin embargo, se prefiere la XSDT
Length4Longitud total de la tabla incluyendo el encabezado
ptrXSDT8Puntero de 64 bits a la tabla XSDT (preferida). Ambas contienen lo mismo,
pero XSDT usa punteros de 64 bits
ExtendedChecksum1Checksum extendido para toda la estructura (no solo los primeros 20 bytes)
Reserved3Reservado, valores indefinidos

El RSDP apunta a las tablas RSDT o XSDT, que contienen referencias a otras tablas ACPI.

Entre ellas destaca la tabla MCFG, que contiene la dirección base MMIO.

Rango de dirección linealRango de dirección en modo realTipo de memoriaUso
0x00000 - 0x003FF0000:0000 - 0000:03FFRAMTabla de vectores de interrupción (IVT)
0x00400 - 0x004FF0040:0000 - 0040:00FFRAMÁrea de datos del BIOS (BDA)
0x00500 - 0x09FBFF0050:0000 - 0090:FBFFRAMMemoria convencional libre (< 1 MB)
0x09FC00 - 0x09FFFF9000:FC00 - 9000:FFFFRAMEBDA (Extended BIOS Data Area)
0x0A0000 - 0x0BFFFFA000:0000 - B000:FFFFVideo RAMFramebuffers VGA
0x0C0000 - 0x0C7FFFC000:0000 - C000:7FFFROMBIOS de video (~32 KB típico)
0x0C8000 - 0x0EFFFFC800:0000 - E000:FFFFROMHardware mapeado y dispositivos varios
0x0F0000 - 0x0FFFFFF000:0000 - F000:FFFFROMBIOS de la placa base (~64 KB típico)
0x100000 - 0xFEBFFFFFRAMMemoria extendida libre (≥ 1 MB)
0xFEC00000 - 0xFFFFFFFFVariosBIOS, ACPI, NVRAM, recursos de chipset, etc.

El sistema recorre estas tablas buscando la firma "MCFG".

OffsetTamaño (bytes)Descripción
04Firma de la tabla (“MCFG”)
44Longitud de la tabla (en bytes)
81Revisión
91Checksum (la suma de todos los bytes & 0xFF debe ser 0)
106OEM ID (igual significado que en otras tablas ACPI)
168OEM Table ID (identificador del fabricante/modelo)
244OEM Revision (igual que en otras tablas ACPI)
284Creator ID (igual que en otras tablas ACPI)
324Creator Revision (igual que en otras tablas ACPI)
368Reservado

Estructuras de asignación de direcciones base (Configuration Space Base Address Allocation)

OffsetTamaño (bytes)Descripción
08Dirección base del mecanismo de configuración mejorado (MMIO Base Address)
82Número de grupo de segmento PCI
101Número de bus PCI inicial
111Número de bus PCI final
124Reservado

El controlador de bus PCI adquiere tablas BIOS y ACPI durante el tiempo de arranque de Windows y las almacena en caché en la memoria y en el registro. Luego, el controlador de bus PCI o cualquier API de subsistema en modo kernel en Windows utilizan esta información en cachés para obtener la dirección base MMIO y realizar operaciones de registro IO. Para la operación de E/S en los registros del espacio de configuración PCI, el controlador PCIbus leerá y escribirá en los registros utilizando la fórmula mostrada cuando recibe IRP del controlador del dispositivo funcional. PCI busdriver también es responsable de leer/escribir en registros de direcciones base BAR utilizando el mismo método.

Dentro de la MCFG, en el offset 44, se encuentra la dirección base MMIO de 64 bits. En la práctica, muchos sistemas utilizan solo los 32 bits inferiores.

Una vez obtenida, esta dirección permite acceder a todo el espacio de configuración PCIe del sistema.

Windows cachea esta información durante el arranque, permitiendo accesos rápidos posteriores. Tanto el controlador de bus PCI como otros componentes del kernel utilizan esta información para resolver direcciones y ejecutar operaciones de E/S.

Conclusión

Los instrumentos modulares representan un cambio fundamental respecto a los instrumentos tradicionales: eliminan capas de abstracción como SCPI y operan directamente sobre el hardware mediante acceso a memoria.

Este modelo ofrece ventajas claras en términos de rendimiento, latencia y control, pero también requiere un entendimiento más profundo del sistema, incluyendo:

En entornos avanzados como pruebas de alto rendimiento, ingeniería inversa o desarrollo de hardware este conocimiento no es opcional, sino esencial.

Todos los componentes del ecosistema PXIe/AXIe, desde controladores IVI hasta interfaces gráficas, dependen internamente de este mecanismo. Cada operación realizada sobre un instrumento es, en última instancia, una operación sobre memoria mapeada.

Entender esto permite no solo usar mejor los instrumentos, sino también manipularlos, optimizarlos e incluso analizarlos desde una perspectiva más cercana al hardware.

Espero que esta informacion sirva de ayuda o contextualizacion para lo que sea que estes trabajando.


Edit page
Share this post on:

Previous Post
Búsqueda de errores en SMM
Next Post
Hacking a Equipos médicos