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?
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
@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
Ah. Ich habs. Ich habe eine Antwort für dich. – stdcall