Hace tiempo que no se pregunta, pero odio las preguntas huérfanas :)
En primer lugar, simplifiquemos demasiado una plataforma x86 moderna y hagamos como si tuviera 32 bits de espacio de direcciones desde 0x00000000 hasta 0xFFFFFFFF. Ignoraremos todas las áreas especiales/reservadas, los huecos TOLUD (top of lower usable DRAM, jerga de Intel), etc. Llamaremos a esto 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 tercera 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 tiene un espacio de configuración de 256 bytes -- esto se extiende a 4KB para PCI express. Este espacio de 4KB consume memoria direcciones del mapa de memoria del sistema, pero los valores / bits / contenidos reales se implementan generalmente en registros del dispositivo periférico. Por ejemplo, cuando se lee el Vendor ID o el Device ID, 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 son "asignados a la RAM" - no es cierto, los bits reales / elementos de estado se encuentran en el dispositivo periférico. Sin embargo, se asignan al mapa de memoria del sistema. A continuación, preguntaste si se trataba de un conjunto común de registros en todos los dispositivos PCIe - sí y no. Tal y como funciona el espacio de configuración PCI, hay un puntero al final de cada sección que indica si hay más "cosas" que 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 su utilidad para el funcionamiento, bueno, es obligatorio y muy utilizado. :)
Ahora, tu pregunta sobre los BARs (registros de dirección base) es un buen espacio para pasar al espacio de memoria y al espacio de E/S. Siendo algo x86 céntrico, la especificación permite la especificación de un tamaño BAR, además del tipo. Esto permite a un dispositivo solicitar un BAR normal mapeado en memoria, o un BAR de espacio de E/S, que consume parte de los 4K de espacio de E/S que tiene una máquina x86. Te darás cuenta de que en las máquinas PowerPC, las BAR de espacio de E/S no tienen ningún valor.
Un BAR es básicamente la forma que tiene el dispositivo de indicar al host cuánta memoria necesita y de qué tipo (como se ha explicado anteriormente). Si pido, por ejemplo, 1MB de espacio de memoria, la BIOS puede asignarme la dirección 0x10000000 a 0x10100000. Esto es no consumiendo RAM física, sólo espacio de direcciones (¿ves ahora por qué los sistemas de 32 bits tienen problemas con las tarjetas de expansión como las GPUs de gama alta que tienen GB de RAM?) Ahora una escritura / lectura de memoria a digamos 0x10000004 se enviará al dispositivo PCI Express, y que puede ser un registro de byte de ancho que se conecta a los LED. Así que si escribo 0xFF a la dirección de memoria física 0x10000004, se encenderán 8 LEDs. Esta es la premisa básica de E/S mapeadas en memoria .
Espacio de E/S se comporta de forma 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.
Tu última pregunta, mensajes se refieren a un nuevo tipo de mecanismo de interrupción, interrupciones con señal de mensaje o MSI para abreviar. Los dispositivos PCI heredados tenían cuatro pines de interrupción, INTA, INTB, INTC, INTD. Éstos generalmente se distribuían entre las ranuras de tal forma que INTA iba a INTA en la ranura 0, luego a INTB en la ranura 1, luego a INTC en la ranura 2, a INTD en la ranura 3, y luego de vuelta a INTA en la ranura 4. La razón de esto es que la mayoría de los dispositivos PCI implementan sólo INTA y al swizzlearlo, teniendo digamos 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 interrupciones usando la capa de protocolo PCI Express, y el complejo raíz PCIe (el host) se encarga de interrumpir a la CPU.
Puede que esta respuesta llegue demasiado tarde para ayudarte, pero tal vez ayude a algún futuro Googler / Binger.
Por último, recomiendo la lectura de este libro de Intel para obtener una buena y detallada introducción a PCIe antes de seguir adelante. Otra referencia sería el Linux Device Drivers, un ebook en línea de LWN .