CPU/DMA はどのようにハードディスクにアクセスするのでしょうか?

CPU/DMA はどのようにハードディスクにアクセスするのでしょうか?

x86 CPU / LINUX を検討中

CPU または DMA がハード ドライブにどのようにアクセスするかを理解したいのですが、ハード ドライブは IO ポート アドレスを介してアクセスする必要がありますか、それともメモリ (MMIO) にマップする必要がありますか?

答え1

ハードドライブ上のデータは物理アドレス空間の一部ではありませ ん。1データメモリマップされていません。

たとえば、SATA コントローラには、CPU がn特定のディスク オフセットから特定の物理メモリ アドレスにセクターを DMA 転送するようにプログラムするために書き込む必要がある I/O レジスタがあります。

これらのI/Oレジスタの一部またはすべては、in/outポートIOではなくMMIO(特別なアドレスへの通常のロードとストア)経由でアクセスできる場合があります。ただし、必要なコマンドをSATAコントローラに送信するだけです。(詳細については、参考文献.) AHCI はカーネル <-> ハードウェア ドライバー インターフェイスとして最も広く使用されていますが、他にもインターフェイスは存在します (たとえば、独自のドライバーを必要とする高度な RAID コントローラーなど)。

たとえば、私のマザーボード上の AHCI SATA コントローラーは、次のようになっています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

これらの 2 つの小さな「メモリ」領域 (2k と 8k) はほぼ間違いなく MMIO ポートですが、I/O アドレス空間にはいくつかの I/O ポートもあります。「プリフェッチ不可」はヒントです。読み取りに副作用がある場合は、プリフェッチを無効にする必要があります。

に注意してくださいflags: bus master。これは、メイン メモリとの間で DMA を実行できることを意味します。

しかし私のNVMe SSDのみMMIO スペースがあり、レガシー I/O ポートはありません。

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

最新のハード ドライブ コントローラでは、CPU が「プログラムされた I/O」を使用して一度に 4 バイトまたは 8 バイトのデータをコピーすることはありません。これは、従来の IDE/ATA コントローラのオプションでしたが、hdparmSATA 以前のシステムで DMA 転送を使用するように Linux ドライバを設定するときに、マザーボードまたは PCI HD コントローラで何か問題 (ロックアップやデータ破損など) が発生した場合のフォールバックとしてのみ使用されていました。

技術的には、PIO は AHCI SATA コントローラのオプションとして残っているようです。しかし、デフォルトではありません。ハードウェアが壊れる可能性が実際にあった古き悪しき時代とは異なり、現代の OS では DMA が正しく動作することを安心して期待できます。


脚注1: あなたの「ハードドライブ」が実際には不揮発性DIMMメモリスロットにインテル Optane DC PM、またはバッテリ バックアップされた DRAM)。最近保存されたデータをライトバック CPU キャッシュから不揮発性メモリ マップ ストレージにプッシュすることは、clflushoptまたはのような命令の使用例の 1 つですclwb

関連情報