Ha pasado un tiempo desde que se hizo esto, pero odio las preguntas huérfanas :)
Primero, simplifiquemos en exceso una plataforma moderna x86 y pretendamos que tiene 32 bits de espacio de direcciones de 0x00000000 a 0xFFFFFFFF. Ignoraremos todas las áreas especiales / reservadas, agujeros TOLUD (parte superior de la DRAM utilizable inferior, lenguaje Intel), etc. Llamaremos a este mapa de memoria del sistema .
En segundo lugar, PCI Express extiende PCI. Desde el punto de vista del software, son muy, muy similares.
Saltaré a tu 3ra - espacio de configuración - primero. Cualquier dirección que apunte al espacio de configuración se asigna desde el mapa de memoria del sistema . Un dispositivo PCI tenía un espacio de configuración de 256 bytes, esto se extiende a 4KB para PCI express. Este espacio de 4KB consume direcciones de memoria del mapa de memoria del sistema, pero los valores / bits / contenidos reales generalmente se implementan en registros en el dispositivo periférico. Por ejemplo, cuando lee la ID del proveedor o la ID del dispositivo, el dispositivo periférico de destino devolverá los datos aunque la dirección de memoria utilizada sea del mapa de memoria del sistema.
Usted dijo que estos están "asignados a la RAM"; no es cierto, los bits / elementos con estado reales están en el dispositivo periférico. Sin embargo, se asignan al mapa de memoria del sistema. A continuación, preguntó si era un conjunto común de registros en todos los dispositivos PCIe, sí y no. En la forma en que funciona el espacio de configuración PCI, hay un puntero al final de cada sección que indica si hay más "cosas" para leer. Hay un mínimo que todos los dispositivos PCIe tienen que implementar, y luego los dispositivos más avanzados pueden implementar más. En cuanto a lo útil que es para la operación funcional, bueno, es obligatorio y muy utilizado. :)
Ahora, su pregunta sobre BAR (registros de direcciones base) es un buen espacio para segmentar en el espacio de memoria y el espacio de E / S. Al estar algo centrado en x86, la especificación permite la especificación de un tamaño BAR, además del tipo. Esto permite que un dispositivo solicite una BAR mapeada en memoria regular, o una barra espaciadora IO, que consume parte del 4K de espacio de E / S que tiene una máquina x86. Notarás que en las máquinas PowerPC, las barras espaciales de E / S no valen nada.
Una BAR es básicamente la forma en que el dispositivo le dice al host cuánta memoria necesita y de qué tipo (discutido anteriormente). Si solicito por ejemplo 1 MB de espacio asignado en memoria, el BIOS puede asignarme la dirección 0x10000000 a 0x10100000. Esto no consume RAM física, solo espacio de direcciones (¿ves ahora por qué los sistemas de 32 bits tienen problemas con las tarjetas de expansión como las GPU de gama alta que tienen GB de RAM?). Ahora se enviará una memoria de escritura / lectura para decir 0x10000004 al dispositivo PCI Express, y ese puede ser un registro de todo el byte que se conecta a los LED. Entonces, si escribo 0xFF en la dirección de memoria física 0x10000004, se encenderán 8 LED. Esta es la premisa básica de la E / S mapeada en memoria .
El espacio de E / S se comporta de manera similar, excepto que opera en un espacio de memoria separado, el espacio de E / S x86. La dirección 0x3F8 (COM1) existe tanto en el espacio de E / S como en el espacio de memoria y son dos cosas diferentes.
Su última pregunta, los mensajes se refieren a un nuevo tipo de mecanismo de interrupción, interrupciones señaladas por mensaje o MSI para abreviar. Los dispositivos PCI heredados tenían cuatro pines de interrupción, INTA, INTB, INTC, INTD. Estos generalmente se mezclaron entre las ranuras de manera que INTA fue a INTA en la ranura 0, luego INTB en la ranura 1, luego INTC en la ranura 2, INTD en la ranura 3, y luego nuevamente a INTA en la ranura 4. La razón de esto es que la mayoría de PCI los dispositivos implementaron solo INTA y al mezclarlo, teniendo tres dispositivos, cada uno terminaría con su propia señal de interrupción al controlador de interrupción. MSI es simplemente una forma de señalizar las interrupciones utilizando la capa de protocolo PCI Express, y el complejo raíz PCIe (el host) se encarga de interrumpir la CPU.
Esta respuesta puede ser demasiado tarde para ayudarlo, pero tal vez ayude a algún futuro Googler / Binger.
Finalmente, recomiendo leer este libro de Intel para obtener una buena introducción detallada a PCIe antes de continuar. Otra referencia sería Linux Device Drivers, un libro electrónico en línea de LWN .