Berücksichtigung von x86-CPU / LINUX
Ich möchte verstehen, wie die CPU oder DMA auf die Festplatte zugreifen. Muss auf die Festplatte über IO-Port-Adressen zugegriffen werden oder muss sie in den Speicher (MMIO) abgebildet werden?
Antwort1
Die Daten auf der Festplatte sind nicht Teil des physischen Adressraums. 1 DieDatenist nicht im Speicher abgebildet.
Der SATA-Controller (zum Beispiel) verfügt über E/A-Register, in die die CPU schreiben muss, um sie für die DMA-Übertragung von n
Sektoren von einem bestimmten Festplatten-Offset zu einer bestimmten physischen Speicheradresse zu programmieren.
Einige oder alle dieser I/O-Register sind möglicherweise über MMIO (normales Laden und Speichern an spezielle Adressen) statt über in
/ out
port IO zugänglich. Aber es geht trotzdem nur darum, die gewünschten Befehle an den SATA-Controller zu senden. (Details dazu finden Sie unterhttps://wiki.osdev.org/AHCI.) AHCI ist die am weitesten verbreitete Art der Schnittstelle zwischen Kernel und Hardwaretreiber, es gibt jedoch auch andere (z. B. ausgefallene RAID-Controller, die ihre eigenen Treiber benötigen).
zB der AHCI SATA-Controller auf meinem Motherboard, laut lspci -v
:
00:17.0 SATA controller: Intel Corporation Q170/Q150/B150/H170/H110/Z170/CM236 Chipset SATA Controller [AHCI Mode] (rev 31) (prog-if 01 [AHCI 1.0])
Subsystem: ASUSTeK Computer Inc. Q170/Q150/B150/H170/H110/Z170/CM236 Chipset SATA Controller [AHCI Mode]
Flags: bus master, 66MHz, medium devsel, latency 0, IRQ 135
Memory at f7248000 (32-bit, non-prefetchable) [size=8K]
Memory at f724c000 (32-bit, non-prefetchable) [size=256]
I/O ports at f090 [size=8]
I/O ports at f080 [size=4]
I/O ports at f060 [size=32]
Memory at f724b000 (32-bit, non-prefetchable) [size=2K]
Capabilities: <access denied>
Kernel driver in use: ahci
Kernel modules: ahci
Diese beiden kleinen „Speicher“-Bereiche (2k und 8k) sind mit ziemlicher Sicherheit MMIO-Ports, aber es gibt auch einige I/O-Ports im I/O-Adressraum. Das „nicht vorabrufbar“ ist hier ein Hinweis; wenn Lesevorgänge einen Nebeneffekt haben, muss das Vorabrufen deaktiviert werden.
Beachten Sie das flags: bus master
. Das bedeutet, dass DMA zum/vom Hauptspeicher möglich ist.
Aber meine NVMe SSDnurverfügt über MMIO-Speicherplatz, keine veralteten E/A-Ports.
03:00.0 Non-Volatile memory controller: Intel Corporation SSD 600P Series (rev 03) (prog-if 02 [NVM Express])
Subsystem: Intel Corporation SSD 600P Series
Flags: bus master, fast devsel, latency 0, IRQ 16, NUMA node 0
Memory at f7000000 (64-bit, non-prefetchable) [size=16K]
Capabilities: <access denied>
Kernel driver in use: nvme
Moderne Festplattencontroller veranlassen die CPU nicht, die Daten mit „programmiertem I/O“ 4 oder 8 Bytes auf einmal zu kopieren. Das war eine Option bei klassischen IDE-/ATA-Controllern, aber nur als Fallback für den Fall, dass etwas Schlimmes passierte (wie Abstürze oder Datenbeschädigung) auf Ihrem Motherboard oder PCI-HD-Controller, wenn Sie hdparm
die Linux-Treiber so einstellen, dass sie DMA-Übertragungen auf Systemen vor SATA verwenden.
Technisch gesehen ist PIO anscheinend immer noch eine Option für AHCI-SATA-Controller. Aber es ist nie die Standardeinstellung. Anders als in den schlechten alten Zeiten, als defekte Hardware eine echte Möglichkeit war, können moderne Betriebssysteme sicher davon ausgehen, dass DMA ordnungsgemäß funktioniert.
Fußnote 1: es sei denn, Ihre "Festplatte" ist tatsächlich einenichtflüchtiges DIMMin einem Speichersteckplatz, wieIntel Optane DC PM, oder ein batteriegestütztes DRAM). Das Übertragen kürzlich gespeicherter Daten aus CPU-Caches mit Schreibzugriff auf nichtflüchtigen, speicherabgebildeten Speicher ist ein Anwendungsfall für Anweisungen wie clflushopt
oder clwb
.