Come funziona il Base Address Registers (BAR) in una scheda PCI?

4

Sto cercando di capire come funzionano gli indirizzi di base (BAR) in una scheda PCI, questo è il modo in cui penso che funzionino:

  • Ogni funzione in una scheda PCI ha 6 campi BAR e ogni campo BAR è Dimensione 32 bit.
  • Il produttore della scheda PCI scriverà in ciascun campo BAR quanto memoria che vuole allocare il sistema operativo e ogni campo BAR specificherà anche se desidera che questa memoria allocata utilizzi IO mappato in memoria o IO mappato in porta .
  • Il sistema operativo leggerà ogni campo BAR e assegnerà il memoria specificata e scriverà l'indirizzo iniziale per ogni memoria allocata blocco nel corrispondente campo BAR.

Sono corretto?

    
posta Christopher 09.10.2017 - 09:15
fonte

1 risposta

4

Questa domanda dovrebbe essere spostata sullo stackoverflow. Forse qualcuno lo farà.

Am I correct?

In sostanza, sì.

Ogni BAR mantiene l'indirizzo di un'area di comunicazione. Questo indirizzo può essere impostato e letto dal sistema operativo come parte della configurazione del dispositivo più grande.

Per ogni BAR (indipendentemente), il dispositivo memorizza solo alcuni dei bit che il processore potrebbe scrivere e ignora gli altri. Dei 28 bit possibili (nella configurazione BAR a 32 bit) il dispositivo memorizza solo un certo numero di bit superiori e ignora i rimanenti bit inferiori.

A causa di questo meccanismo, la specifica consente solo le dimensioni dell'area di comunicazione che sono poteri di 2, e solo l'allineamento all'interno dello spazio degli indirizzi della stessa potenza di 2.

Se il sistema operativo scrive un -1 (cioè tutti i 1) su una BAR e lo legge indietro, recupererà quei 1 solo per i bit (superiori) che questa BAR nel dispositivo memorizza / rappresenta, e ottiene indietro gli zeri per i bit più bassi che questa BAR non memorizza / rappresenta.

Il numero di quelli (zeri) restituiti indica al sistema operativo ciò che deve sapere, ovvero quanti bit sono (o non sono) rappresentati nella BAR. Da ciò può facilmente determinare la dimensione dello spazio degli indirizzi che il dispositivo desidera e l'allineamento che si aspetta. Vedi qui per maggiori dettagli.

Dopo aver assegnato lo spazio di indirizzamento appropriato, scrive quel valore reale sulla BAR (sostituendo il precedente scritto -1). La BAR ora è configurata correttamente.

NB: Il sistema operativo alloca spazio indirizzo , non memoria attuale : è come se la memoria perché l'area di comunicazione viene fornita dal dispositivo e che il processore può indirizzarla a partire da questa posizione.

Il sistema operativo in realtà non chiede formalmente l'hardware per dimensioni e amp; allineamento dell'area di comunicazione, ma piuttosto usa questo trucco per scrivere tutti i 1 e osservare l'effetto.

L'hardware non deve sapere che il sistema operativo sta "scherzando" sul -1 (o altrimenti sta effettivamente facendo una richiesta); semplicemente fa quello che fa sempre con una scrittura su una BAR (cioè memorizzando i N bit superiori), e onora una richiesta di lettura (BAR) come normalmente farebbe (restituendo quei N bit superiori concatenati con zeri per i bit inferiori non memorizzati ).

    
risposta data 10.10.2017 - 20:42
fonte

Leggi altre domande sui tag