Sto eseguendo il kernel Linux 3.3 su Microblaze di Xilinx con MMU completo. il compito che sto facendo richiede che io sappia quanto segue: Ho bisogno di creare un file di testo (buffer) e localizzare l'indirizzo fisico di questo buffer e non voglio che il kernel scriva questo file in regioni di memoria discontinue.ottiene l'indirizzo fisico di un buffer sotto Linux
la ragione per cui ho bisogno di questo perché ho un motore DMA che flussi di dati da un indirizzo di memoria fisica di preselezione, quindi ho bisogno di forzare Linux per creare il file di buffer in quella posizione di memoria esatta, in modo che quando scrivo i dati in questo File sua immediatamente trasmessa dal motore DMA ad un altro nucleo Hardware
Maggiori dettagli:.
mio sistema ha un MB di RAM DDR3 512 collegato al sistema tramite "multiregolatore memoria porta Xilinx'(MPMC) l'indirizzo di base di questo controller di memoria è 0x90000000, tutte le unità nella memoria di accesso del sistema attraverso questo controller, incluso MicroBlaze, l'unità DMA che ho utilizza un'interfaccia speciale chiamata Native Perso nality Interface (NPI) per comunicare con la memoria ad un livello molto basso, risultando così una prestazione ad altissima velocità.
Questa unità DMA NPI è stata originariamente progettata per essere utilizzata in un kernel embedded di base chiamato "xilkernel" che non supportava la memoria virtuale, né MMU faceva parte di MicroBlaze, quindi il programmatore poteva vedere dove risiederà il codice OS e seleziona un indirizzo di memoria fisico come 0x91800000 come indirizzo sorgente da cui verrà eseguito lo streaming DMA, quindi il programmatore può posizionare un file con quell'indirizzo esatto ed eseguire il sistema
quando è necessario migrare il progetto per utilizzare Linux invece di xilkernel ci siamo imbattuti in questo problema, ho dei file su un dispositivo di archiviazione esterno a cui posso accedere come dispositivo a blocchi da Linux e ho bisogno di spostare ciascun file nella memoria principale (RAM DDR3) e fare in modo che il DMA trasmetta il file in streaming. attualmente gli stream DMA da un indirizzo fisso ma posso renderlo generico se necessario.
Dai un'occhiata a questo PDF di un capitolo che spiega come il kernel Linux gestisce la memoria virtuale e fisica. Fornisce esempi su come mappare e appuntare la memoria fisica per vari scenari. http://lwn.net/images/pdf/LDD3/ch15.pdf –
@bromanous Hai sviluppato questo dispositivo da solo o è un core IP di terze parti che non puoi modificare? Se è possibile modificarlo, consiglio vivamente di configurare il software di indirizzi DMA in modo che sia possibile utilizzare le funzioni DMA standard di cui parla tian_yufen. –
@BenjaminLeinweber, sì, ho il codice sorgente per il core DMA e posso configurare l'indirizzo da cui passa DMA e renderlo un parametro generico. – bromanous