CPU/DMA는 어떻게 하드 디스크에 액세스합니까?

CPU/DMA는 어떻게 하드 디스크에 액세스합니까?

x86 CPU / LINUX 고려

CPU 또는 dma가 하드 드라이브에 어떻게 액세스하는지 알고 싶습니다. 하드 드라이브는 IO 포트 주소를 통해 액세스해야 합니까, 아니면 메모리(MMIO)에 매핑해야 합니까?

답변1

하드 드라이브의 데이터는 물리적 주소 공간의 일부가 아닙니다. 1데이터메모리 매핑되지 않습니다.

n예를 들어 SATA 컨트롤러 에는 특정 디스크 오프셋에서 특정 물리적 메모리 주소로 섹터를 DMA 전송하도록 프로그래밍하기 위해 CPU가 기록해야 하는 I/O 레지스터가 있습니다 .

in이러한 I/O 레지스터 중 일부 또는 전부는 / out포트 IO 가 아닌 MMIO(특수 주소에 대한 일반 로드 및 저장)를 통해 액세스할 수 있습니다 . 하지만 여전히 원하는 명령을 SATA 컨트롤러에 보내는 문제일 뿐입니다. (자세한 내용은 다음을 참조하세요.https://wiki.osdev.org/AHCI.) AHCI는 가장 널리 사용되는 종류의 커널 <-> 하드웨어 드라이버 인터페이스이지만 다른 것들도 존재합니다(예: 자체 드라이버가 필요한 고급 RAID 컨트롤러).

예를 들어 내 mobo의 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

이러한 작은 두 개의 "메모리" 영역(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

최신 하드 드라이브 컨트롤러는 "프로그램된 I/O"를 사용하여 CPU가 한 번에 4바이트 또는 8바이트의 데이터를 복사하도록 만들지 않습니다. 이는 기존 IDE/ATA 컨트롤러의 옵션이었지만 hdparmSATA 이전에서 DMA 전송을 사용하도록 Linux 드라이버를 설정하는 데 사용할 때 마더보드나 PCI HD 컨트롤러에 문제가 발생한 경우(예: 잠금 또는 데이터 손상)에 대비한 대체 수단으로만 사용되었습니다. 시스템.

기술적으로 PIO는 여전히 AHCI SATA 컨트롤러의 옵션입니다. 그러나 이는 결코 기본값이 아닙니다. 하드웨어 고장이 실제로 가능했던 옛날과는 달리 현대 OS는 DMA가 올바르게 작동할 것이라고 안전하게 기대할 수 있습니다.


각주 1: "하드 드라이브"가 실제로비휘발성 DIMM메모리 슬롯 같은 곳에인텔 옵테인 DC PM또는 배터리 지원 DRAM). 최근에 저장된 데이터를 다시 쓰기 CPU 캐시에서 비휘발성 메모리 매핑 스토리지로 푸시하는 것은 clflushopt또는 와 같은 명령어의 한 가지 사용 사례입니다 clwb.

관련 정보