È passato un po 'di tempo da quando è stato chiesto, ma odio le domande orfane :)
Innanzitutto, semplifichiamo eccessivamente una moderna piattaforma x86 e facciamo finta che abbia 32 bit di spazio degli indirizzi da 0x00000000 a 0xFFFFFFFF. Ignoreremo tutte le aree speciali / riservate, i fori TOLUD (parte superiore della DRAM utilizzabile inferiore, Intel Parlance), ecc. Chiameremo questa mappa di memoria del sistema .
In secondo luogo, PCI Express estende PCI. Dal punto di vista del software, sono molto, molto simili.
Salterò al tuo terzo - spazio di configurazione - per primo. Tutti gli indirizzi che puntano allo spazio di configurazione vengono allocati dalla mappa di memoria del sistema . Un dispositivo PCI aveva uno spazio di configurazione di 256 byte, che è esteso a 4KB per PCI express. Questo spazio 4KB consuma gli indirizzi di memoria dalla mappa di memoria del sistema, ma i valori / bit / contenuti effettivi sono generalmente implementati nei registri sul dispositivo periferico. Ad esempio, quando si legge l'ID fornitore o l'ID dispositivo, la periferica di destinazione restituirà i dati anche se l'indirizzo di memoria utilizzato proviene dalla mappa di memoria del sistema.
Hai dichiarato che questi sono "allocati nella RAM" - non è vero, i bit effettivi / elementi stateful sono nel dispositivo periferico. Tuttavia, vengono mappati nella mappa di memoria del sistema. Successivamente, hai chiesto se fosse un set comune di registri su tutti i dispositivi PCIe: sì e no. Nel modo in cui funziona lo spazio di configurazione PCI, c'è un puntatore alla fine di ogni sezione che indica se ci sono più "cose" da leggere. C'è un minimo indispensabile che tutti i dispositivi PCIe devono implementare, quindi i dispositivi più avanzati possono implementare di più. Quanto a quanto sia utile per il funzionamento funzionale, beh, è obbligatorio e fortemente utilizzato. :)
Ora, la tua domanda sui BAR (registri di indirizzi di base) è un buon spazio da seguire nello spazio di memoria e nello spazio I / O. Essendo in qualche modo incentrato su x86, la specifica consente di specificare una dimensione BAR, oltre al tipo. Ciò consente a un dispositivo di richiedere una normale BAR mappata in memoria, o una barra spaziatrice IO, che consuma parte dello spazio di I / O 4K di una macchina x86. Noterai che sulle macchine PowerPC le BAR spaziali I / O sono inutili.
Una BAR è fondamentalmente il modo in cui il dispositivo comunica all'host quanta memoria ha bisogno e di che tipo (discusso sopra). Se chiedo di dire 1 MB di spazio mappato in memoria, il BIOS può assegnarmi l'indirizzo da 0x10000000 a 0x10100000. Questo non sta consumando RAM fisica, basta indirizzare lo spazio (vedi ora perché i sistemi a 32 bit incontrano problemi con le schede di espansione come le GPU di fascia alta che hanno GB di RAM?). Ora una scrittura / lettura di memoria per dire 0x10000004 verrà inviata al dispositivo PCI Express e potrebbe essere un registro a livello di byte che si collega ai LED. Quindi se scrivo 0xFF all'indirizzo di memoria fisica 0x10000004, accenderò 8 LED. Questa è la premessa di base dell'I / O mappato in memoria .
Lo spazio I / O si comporta in modo simile, tranne per il fatto che opera in uno spazio di memoria separato, lo spazio I / O x86. L'indirizzo 0x3F8 (COM1) esiste sia nello spazio I / O che nello spazio di memoria e sono due cose diverse.
L'ultima tua domanda, i messaggi si riferiscono a un nuovo tipo di meccanismo di interruzione, messaggi segnalati di interruzione o MSI in breve. I dispositivi PCI legacy avevano quattro pin di interruzione, INTA, INTB, INTC, INTD. Questi sono stati generalmente spostati tra gli slot in modo tale che INTA sia passato a INTA su Slot 0, quindi INTB su Slot 1, quindi INTC su Slot 2, INTD su Slot 3 e quindi di nuovo su INTA su Slot 4. Il motivo è che la maggior parte dei PCI i dispositivi implementavano solo INTA e facendolo scorrere, dicendo tre dispositivi, ognuno avrebbe finito con il proprio segnale di interruzione al controller di interruzione. MSI è semplicemente un modo per segnalare gli interrupt utilizzando il livello del protocollo PCI Express e il complesso radice PCIe (l'host) si occupa di interrompere la CPU.
Questa risposta potrebbe essere troppo tardi per aiutarti, ma forse aiuterà qualche futuro Googler / Binger.
Infine, ti consiglio di leggere questo libro di Intel per ottenere una buona e dettagliata introduzione a PCIe prima di andare oltre. Un altro riferimento sarebbe Linux Device Driver, un ebook online di LWN .