2016-08-02 46 views
1

I I/O auf meiner PCIe device.I ist mit Ubuntu 16.0.4 LTS mit Linux-Kernel 4.4.0Wie 32-Bit-PCI-Bar-Speicher in 64-Bit-Linux-Kernel-Umgebung

Das tun will lesen Ausgabe von lspci -v Befehl lautet:

06:00.0 Unclassified device [00ff]: Device 1aa1:2000 (rev 01) 
    Subsystem: Device 1aa1:2000 
    Physical Slot: 1-4 
    Flags: bus master, fast devsel, latency 0, IRQ 16 
    Memory at f1008000 (32-bit, non-prefetchable) [size=8K] 
    Memory at ee000000 (32-bit, non-prefetchable) [size=32M] 
    Memory at f100a000 (32-bit, non-prefetchable) [size=4K] 
    Memory at f0000000 (32-bit, non-prefetchable) [size=16M] 
    Memory at f1000000 (32-bit, non-prefetchable) [size=32K] 
    Capabilities: <access denied> 
    Kernel driver in use: my_pci 
    Kernel modules: my_pci 

Offensichtlich PCI-Adressen sind 32-Bit.

Ich möchte wissen, wie ioread32/iowrite32 Funktionen zum Lesen/Schreiben in die BAR-Adressen verwenden. unsigned char __iomem *mem Typen auf meinem Rechner 64-Bit wäre und wenn ich folgendes sagen verwenden:

ioread32(mem + some_offset); 

Der Ausdruck mem + some_offset würde 64-Bit sein und in Absturz führen.

Wie würde ich die I/O tun?

+1

Bars können nur geschrieben werden, sie müssen dem virtuellen Speicher zugeordnet werden. der Treiber tut dies normalerweise unmittelbar nach der Initialisierung. Sie müssen an diese Adresse + den Offset schreiben. – stdcall

+0

@stdcall Ich weiß, und das ist, wie die Dinge im Quellcode implementiert werden. Aber meine Frage ist etwas anders - Mein Host-Rechner läuft 64-Bit-Ubuntu mit Kernel 4.4.0. Wenn ich meine "lspci -v" -Ausgabe ansehe, können wir sehen, dass die PCI-Balkenadressen 32-Bit sind. Also habe ich mich gefragt/zweifelhaft, ob das Argument zu "ioread32" eine 64-Bit-Adresse wäre, was zu undefiniertem Verhalten führen würde. – Monku

+0

Ah. Ich habs. Ich habe eine Antwort für dich. – stdcall

Antwort

0

Die PCI-Geräte, mit denen Sie arbeiten, arbeiten im 32-Bit-Adressierungsmodus. wenn Ihr PC die BARs aufzählt und die physikalische Adresse auf die BAR schreibt. es schreibt eine maskierte Werte, nur die unteren 32 Bit des 64-Bit (im Host-Adressraum) Drucken Sie die physikalische Adresse, die das OS/BIOS dieser BAR auf dem Treiber zugewiesen und vergleichen Sie es.

Außerdem ist dies eine physikalische Adresse, so dass Sie es nicht iowrite trotzdem tun können.

Also ich verstehe Ihr Ziel nicht wirklich.

+0

Genau das habe ich beim Drucken der Adressen gefunden. Danke für die Antwort. – Monku

+0

'lspci' druckt sie wie in OP gezeigt. – 0andriy