2016-08-04 7 views
3

Ich habe grundlegende Abfrage über ioremap verwendet, um Geräte-IO zugeordnet in Kernel virtuellen Speicher adressiert.Ioremaped Adresse im Kernel

Ich würde gerne wissen, ob die zurückgegebene Adresse von ioremap an Routinen wie virt_to_phys() übergeben wird, würde es Geräte-IO-Adresse zurückgeben?

Dank

Antwort

6

virt_to_phys() ist für virtuelle Adressen im Kernel linearen Karte nur gültig, da es Arithmetik nur einige schnelle Adresse ist, nicht voll gehen Software-Tabelle. Die lineare Karte deckt normalerweise nur RAM ab. Die virtuelle Adresse, die von ioremap() zurückgegeben wird, wird jedoch normalerweise (wahrscheinlich immer, aber ich habe nicht die Geduld, jede Implementierung zu überprüfen) eine Vmalloc-Adresse sein, also wenn Sie das an virt_to_phys() übergeben, werden Sie Unsinn zurückbekommen.

+0

Vielen Dank für Ihre Antwort. Ich sehe Ihren Punkt über schnelle Adressarithmetik, es subtrahieren Sie einfach einige Offset-Adresse von der virtuellen Adresse, um physikalische Adresse zu erhalten. Aber gibt es irgendeine API, die verwendet werden kann, um die Geräte-EA-Adresse von der virtuellen Adresse zurückzugeben, die von ioremap zurückgegeben wurde? –

+1

Die übliche Methode ist wahrscheinlich "erinnern Sie sich, was Sie' ioremap() 'an erster Stelle" genannt haben. Ich habe Mühe, über einen gültigen Grund nachzudenken, die physische Adresse eines zugeordneten Geräts außerhalb des Treibers dieses Geräts zu suchen, und innerhalb des Treibers können Sie einfach die physische Adresse in Ihren privaten Daten neben der CPU-Adresse speichern, wenn Sie wissen, dass Sie gehen um es in Zukunft zu wollen (zB um eine dmaengine Anfrage zu stellen). – Notlikethat