Faz um tempo desde que isso foi feito, mas eu odeio perguntas órfãs :)
Primeiro, vamos simplificar demais uma plataforma x86 moderna e fingir que ela possui 32 bits de espaço de endereço de 0x00000000 a 0xFFFFFFFF. Ignoraremos todas as áreas especiais / reservadas, buracos TOLUD (topo da DRAM de menor uso, linguagem Intel), etc. Vamos chamar esse mapa de memória do sistema .
Segundo, o PCI Express estende o PCI. Do ponto de vista do software, eles são muito, muito parecidos.
Vou pular para o seu terceiro - espaço de configuração - primeiro. Todos os endereços que apontam para o espaço de configuração são alocados no mapa de memória do sistema . Um dispositivo PCI tinha um espaço de configuração de 256 bytes - isso é estendido para 4KB para o PCI Express. Esse espaço de 4KB consome endereços de memória do mapa de memória do sistema, mas os valores / bits / conteúdos reais geralmente são implementados nos registros no dispositivo periférico. Por exemplo, quando você lê o ID do fornecedor ou o ID do dispositivo, o dispositivo periférico de destino retornará os dados mesmo que o endereço de memória usado seja do mapa de memória do sistema.
Você afirmou que eles estão "alocados na RAM" - não é verdade, os bits / elementos com estado reais estão no dispositivo periférico. No entanto, eles são mapeados no mapa de memória do sistema. Em seguida, você perguntou se era um conjunto comum de registros em todos os dispositivos PCIe - sim e não. Como o espaço de configuração do PCI funciona, há um ponteiro no final de cada seção que indica se há mais "coisas" a serem lidas. Existe um mínimo que todos os dispositivos PCIe precisam implementar e os dispositivos mais avançados podem implementar mais. Quanto à utilidade da operação funcional, bem, é obrigatória e muito utilizada. :)
Agora, sua pergunta sobre BARs (registros de endereço base) é um bom espaço para seguir para o espaço da memória e do espaço de E / S. Sendo um pouco centrada em x86, a especificação permite a especificação de um tamanho de BAR, além do tipo. Isso permite que um dispositivo solicite uma BAR regular de memória mapeada ou uma barra de espaço IO, que consome parte do espaço de 4K de E / S de uma máquina x86. Você notará que, nas máquinas PowerPC, as BARs espaciais de E / S são inúteis.
Uma BAR é basicamente a maneira do dispositivo informar ao host quanta memória ele precisa e de que tipo (discutido acima). Se eu pedir, digamos, 1 MB de espaço mapeado na memória, o BIOS poderá me atribuir o endereço 0x10000000 a 0x10100000. Isso não está consumindo RAM física, apenas espaço de endereçamento (você percebe agora por que os sistemas de 32 bits enfrentam problemas com placas de expansão, como GPUs de última geração com GB de RAM?). Agora, uma gravação / leitura de memória para dizer 0x10000004 será enviada para o dispositivo PCI Express e esse pode ser um registro de bytes que se conecta aos LEDs. Portanto, se eu escrever 0xFF no endereço de memória física 0x10000004, isso acenderá 8 LEDs. Essa é a premissa básica de E / S mapeada na memória .
O espaço de E / S se comporta de maneira semelhante, exceto que opera em um espaço de memória separado, o espaço de E / S x86. O endereço 0x3F8 (COM1) existe no espaço de E / S e no espaço da memória e são duas coisas diferentes.
Sua última pergunta, as mensagens referem-se a um novo tipo de mecanismo de interrupção, interrupções sinalizadas por mensagem ou MSI. Os dispositivos PCI herdados tinham quatro pinos de interrupção, INTA, INTB, INTC, INTD. Geralmente, estes eram alternados entre os slots, de modo que o INTA foi para o INTA no Slot 0, depois o INTB no Slot 1, o INTC no Slot 2, o INTD no Slot 3 e depois de volta para o INTA no Slot 4. A razão disso é que a maioria das PCI os dispositivos implementavam apenas o INTA e, passando por swizzling, ou seja, três dispositivos, cada um terminava com seu próprio sinal de interrupção no controlador de interrupção. O MSI é simplesmente uma maneira de sinalizar interrupções usando a camada de protocolo PCI Express, e o complexo raiz PCIe (o host) cuida da interrupção da CPU.
Essa resposta pode ser tarde demais para ajudá-lo, mas talvez ajude alguns futuros Googler / Binger.
Por fim, recomendo a leitura deste livro da Intel para obter uma boa introdução detalhada ao PCIe antes de prosseguir. Outra referência seria o Linux Device Drivers, um ebook online da LWN .