Ha pasado un tiempo desde que se hizo esta pregunta, pero odio las preguntas huérfanas :)
Primero, simplifiquemos en exceso una plataforma x86 moderna y supongamos que tiene 32 bits de espacio de direcciones de 0x00000000 a 0xFFFFFFFF. Ignoraremos todas las áreas especiales / reservadas, los orificios TOLUD (parte superior de la DRAM utilizable más baja, lenguaje de Intel), etc. Llamaremos a este mapa de memoria del sistema .
Segundo, PCI Express extiende PCI. Desde el punto de vista del software, son muy, muy similares.
Saltaré a tu tercero, espacio de configuración , primero. Las direcciones que apuntan al espacio de configuración se asignan desde el mapa de memoria del sistema . Un dispositivo PCI tenía un espacio de configuración de 256 bytes, que se extiende a 4 KB para PCI express. Este espacio de 4 KB consume memoria direcciones del mapa de memoria del sistema, pero los valores / bits / contenido reales generalmente se implementan en los registros del 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 que se está utilizando proviene del mapa de memoria del sistema.
Usted indicó que estos están "asignados a la RAM"; no es cierto, los bits / elementos con estado real están en el dispositivo periférico. Sin embargo, se asignan en el 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. De la forma en que funciona el espacio de configuración de 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 se utiliza en gran medida. :)
Ahora, su pregunta sobre los BAR (registros de dirección base) es un buen espacio para pasar al espacio de memoria y al espacio de E / S. Al estar algo centrado en x86, la especificación permite la especificación de un tamaño de BAR, además del tipo. Esto permite que un dispositivo solicite una BAR normal asignada en memoria, o una BAR de espacio IO, que consume parte del espacio de E / S de 4K que tiene una máquina x86. Notará que en las máquinas PowerPC, los BAR de espacio de E / S no tienen ningún valor.
Un BAR es básicamente la forma en que el dispositivo le dice al host la cantidad de memoria que necesita y de qué tipo (descrito anteriormente). Si pido 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 (¿ve usted 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 puede ser un registro de un byte que se conecta a los LED. Así que si escribo 0xFF en la dirección de memoria física 0x10000004, se encenderán 8 LED. Esta es la premisa básica de E / S asignada en memoria .
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, mensajes se refieren a un nuevo tipo de mecanismo de interrupción, mensaje señalado interrupciones o MSI, para abreviar. Los dispositivos PCI heredados tenían cuatro pines de interrupción, INTA, INTB, INTC, INTD. En general, estos se utilizaron entre las ranuras, de modo 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 de nuevo a INTA en la Ranura 4. La razón de esto es que la mayoría de los PCI Los dispositivos se implementaron solo INTA y, al decirlo con tres, 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 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 ayudarte, pero quizás ayude a algún futuro Googler / Binger.
Finalmente, recomiendo leer este libro de Intel para obtener una buena introducción detallada de PCIe antes de ir más lejos. Otra referencia sería Linux Device Drivers, un libro electrónico en línea de LWN .