Spazi indirizzo in PCIe


19

Esistono quattro spazi indirizzo in PCI express:

  • Memoria mappata
  • I / O mappato
  • Spazio di configurazione
  • Messaggio

Qualcuno può spiegare il significato di ogni spazio degli indirizzi e il suo scopo in breve?

Secondo la mia comprensione, tutti questi spazi sono allocati nella RAM (cioè nella memoria del processore). Lo spazio di configurazione è lo spazio allocato per l'insieme comune di registri (presente in tutti i dispositivi PCIe). Questo spazio è comune tra tutti i dispositivi PCIe? E quanto è utile per il funzionamento funzionale PCIe?

Questo spazio contiene BAR (registro degli indirizzi di base). Questo registro viene utilizzato per specificare l'indirizzo disponibile nell'endpoint PCIe?

Sono nuovo del PCIe e sto cercando di impararlo. Mi riferisco alle specifiche di base, ma penso che sia scritto per i lettori che hanno una conoscenza precedente di PCI e PCIe.

Inoltre, si prega di fare riferimento ad alcuni riferimenti online gratuiti utili per accelerare la comprensione delle specifiche di base. Capisco che ogni qualvolta un dispositivo PCIe collegato a un complesso root verrà assegnato con una regione di memoria.

Risposte:


31

È 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 .


Il Post è stato molto utile. Sono molto nuovo a PCIe, affinché avvenga il processo di enumerazione (allocazione e mappatura dello spazio di configurazione), è necessario il supporto del driver o può essere avviato da Os.
Kamlendra,

Grazie, felice che sia stato utile! In genere, su piattaforme x86, il software BIOS esegue una certa quantità di allocazione della memoria in base alle informazioni sullo spazio di configurazione che analizza dai dispositivi PCI. I sistemi operativi moderni generalmente accettano questa mappa di memoria così com'è, AFAIK, anche se anche loro attraverseranno ed enumereranno i dispositivi per caricare i driver appropriati. Ricordo di aver visto alcune cose interessanti di basso livello in Linux che potrebbero permetterti di cambiare potenzialmente ciò che il BIOS aveva assegnato.
Krunal Desai,

Si noti che solo la memoria contrassegnata come pre-configurabile può trasferire più di un singolo DWORD per transazione; tutti gli altri spazi possono trasferire solo un singolo DWORD per transazione. La dimensione di un burst è limitata a MAX_PAYLOAD_SIZE (rilevata durante l'enumerazione).
Peter Smith,

Ciao. Sono nuovo di PCI e vorrei un po 'di chiarimenti sulla tua risposta. Hai dichiarato che i 256b / 4k byte di spazio di configurazione sono mappati nella memoria di sistema. Dal mio auto-tutoraggio, ho pensato che l'accesso allo spazio di configurazione fosse gestito tramite un controller PCI che è mappato staticamente nella memoria di sistema. Questo controller fornisce alcuni registri (per l'identificazione di dispositivo / funzione, offset nello spazio degli indirizzi, indirizzo dei risultati) che fungono da piccola interfaccia nello spazio di configurazione. Quindi, in effetti, solo circa 5-10 byte sono staticamente riservati al controller PCI. È giusto ???
Cerezo,

Quindi, quando l'host (CPU) scrive in un registro all'indirizzo 0x10000004 un valore 0xFF, il complesso radice PCI recupererà questi dati (forse è sempre stato il polling per un dato a qualsiasi indirizzo da 0x10000000 a 0x10100000) e lo scriverà all'indirizzo 0x04 all'endpoint (dispositivo PCIe)? Questa comprensione è corretta?
AlphaGoku
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.