수정 이력

1개의 판이 있어요. 줄마다 펼쳐 바뀐 부분을 보거나, 두 판을 골라 비교할 수 있어요.

왼쪽 동그라미 = 이전 판, 오른쪽 = 이후 판
#395AI 조사: 게임 용어 문서GGWiki 자동 · · 현재 판+6,866자
1번째 줄 근처
추가: ## 개요
추가: 직접 메모리 접근(直接 - 接近, Direct Memory Access, DMA)은 특정 하드웨어 하위 시스템이 중앙처리장치(CPU)와 독립적으로 메인 시스템 메모리(주기억장치)에 직접 접근하여 데이터를 읽거나 쓸 수 있게 해주는 컴퓨터 시스템의 기능이다. CPU가 모든 데이터 이동을 중개하던 프로그램 입출력(PIO, Programmed Input/Output) 방식의 병목 현상을 해소하기 위해 고안되었다. DMA를 사용하면 CPU는 데이터 전송을 시작한 뒤 전송이 진행되는 동안 다른 연산을 수행할 수 있으며, 전송이 완료되면 DMA 컨트롤러(DMAC)로부터 인터럽트 한 번만 수신하면 된다. 이 기능은 CPU가 데이터 전송 속도를 따라잡기 어렵거나, 비교적 느린 입출력 장치의 데이터 전송을 기다리는 동안 CPU 자원을 다른 작업에 활용해야 할 때 특히 유용하다. 디스크 드라이브 컨트롤러, 그래픽 카드, 네트워크 카드, 사운드 카드 등 다양한 하드웨어가 DMA를 사용하며, 멀티 코어 프로세서 내부에서의 칩 간 데이터 전송이나 메모리 간 복사, 스캐터-개더(scatter-gather) 연산 등에도 활용된다. 과거에는 IBM의 특허 기술이었으나 현재는 특허권이 소멸되었다.[1][2][3]
추가:
추가: ## 작동 방식과 유형
추가:
추가: ### 서드파티 DMA (Third-party DMA, 표준 DMA)
추가:
추가: 별도의 DMA 컨트롤러(DMAC)가 시스템 버스 제어권을 얻어 메모리 주소를 생성하고 읽기/쓰기 사이클을 개시하는 전통적인 방식이다. CPU가 DMAC의 레지스터(메모리 주소 레지스터, 바이트 카운트 레지스터, 제어 레지스터 등)를 설정하여 전송할 데이터 양, 소스/대상 주소, 전송 방향(장치→메모리 또는 메모리→장치), 전송 단위 크기, 버스트당 전송 횟수 등을 지정한다. 이후 주변 장치가 데이터 전송을 시작하면 DMAC이 메모리에 주소와 제어 신호를 제공하며 데이터 이동을 수행한다. 데이터 1바이트(또는 1워드) 전송마다 내부 주소 레지스터를 증가시키며 블록 전송을 완료한다. 이 방식에서는 DMAC이 버스 마스터 역할을 하며 CPU는 전송 중 버스에서 물러나 있다.[2][3]
추가:
추가: ### 버스 마스터링 / 퍼스트파티 DMA (Bus Mastering / First-party DMA)
추가:
추가: 중앙 DMAC 없이 주변 장치 자체가 버스 마스터가 되어 시스템 버스의 제어권을 획득하고, CPU 개입 없이 직접 메모리 주소와 제어 신호를 내보내며 메모리에 읽기/쓰기를 수행하는 방식이다. PCI, PCIe, AHB 등 현대 버스 아키텍처에서 표준적으로 채택된다. 장치 내부에 주소 레지스터, 카운트 레지스터 등 DMA 제어용 하드웨어 레지스터를 갖춘다. 버스 경합을 방지하기 위해 CPU를 홀드(Hold) 상태로 두거나 버스 아비터(Arbitrer)가 소유권을 중재한다. PCI의 경우 PCI 버스 컨트롤러(호스트 브리지 또는 PCI-to-PCI 브리지)가 다중 장치의 버스 소유권 요청을 중재하며, 한 시점에 단 하나의 버스 마스터만 존재할 수 있다. 현대의 x86 시스템에서 PCI 장치가 DMA를 수행하면 사우스브리지 → DMI → CPU 내장 메모리 컨트롤러 → DDR 메모리 버스의 경로를 거친다.[2][3]
추가:
추가: ### 동작 모드
추가:
추가: DMA 컨트롤러(또는 버스 마스터 장치)가 시스템 버스를 점유하는 방식에 따라 세 가지 주요 모드로 나뉜다.
추가:
추가: #### 버스트 모드 (Burst Mode, 블록 전송 모드)
추가:
추가: 전체 데이터 블록을 하나의 연속된 시퀀스로 전송한다. DMA 컨트롤러가 CPU로부터 버스 사용 허가(BG, Bus Grant)를 받으면 블록의 모든 데이터를 전송할 때까지 버스를 독점하고, 완료 후 버스 제어권을 CPU에 반환한다. 이 동안 CPU는 버스에 접근할 수 없어 비활성 상태가 된다. 전송 속도는 가장 빠르지만 CPU 대기 시간이 길다.[2][3]
추가:
추가: #### 사이클 도용 모드 (Cycle Stealing Mode)
추가:
추가: CPU가 장시간 비활성화되어선 안 되는 시스템에서 사용한다. 버스트 모드와 마찬가지로 BR(Bus Request)/BG(Bus Grant) 핸드셰이크로 버스 소유권을 얻지만, 1바이트(또는 1워드) 전송 직후 즉시 버스 제어권을 CPU에 반환(BG 해제)한다. 이후 전체 블록이 전송될 때까지 BR을 반복하여 요청당 1단위씩 전송한다. 결과적으로 DMA 전송과 CPU 명령 처리가 교차 실행되어(CPU 명령 1개 → DMA 데이터 1개 → CPU 명령 1개 …) CPU가 길게 멈추지 않는다. 데이터 전송률은 버스트 모드보다 낮지만 실시간 모니터링이 필요한 컨트롤러에 적합하다.[2][3]
추가:
추가: #### 투명 모드 (Transparent Mode, 은닉 DMA 데이터 전송 모드)
추가:
추가: 전체 시스템 성능 관점에서 가장 효율적인 모드다. DMA 컨트롤러가 CPU가 시스템 버스를 사용하지 않는 명령(예: 내부 레지스터 연산, 캐시 히트 연산 등)을 수행하는 사이클에만 데이터를 전송한다. CPU는 프로그램 실행을 전혀 멈추지 않으나, DMA 전송이 우선순위를 갖지 못하고 하드웨어가 CPU의 버스 미사용 시점을 예측·판별해야 하므로 구현이 복잡하다.[2][3]
추가:
추가: ### 캐시 간섭과 일관성 문제
추가:
추가: CPU에 캐시가 있고 DMA 장치가 외부 메모리에 직접 접근할 때 캐시 일관성(Cache Coherency) 문제가 발생할 수 있다. 라이트백(Write-back) 캐시 환경에서 CPU가 메모리 위치 X를 읽으면 캐시에 사본이 저장되고, 이후 CPU의 쓰기 연산은 캐시만 갱신하고 외부 메모리는 갱신하지 않는다. 이 상태에서 DMA 장치가 메모리 X를 읽으면 구버전(Stale) 데이터를 받게 된다. 반대로 DMA 장치가 메모리 X에 새 값을 쓰면 캐시의 사본은 무효(Stale) 상태가 되어 CPU가 잘못된 값을 사용하게 된다.[2][3]
추가:
추가: 해결책은 두 가지 접근으로 나뉜다.
추가:
추가: * **하드웨어 캐시 일관성 유지 (Cache-coherent systems, 버스 스누핑):** 외부 버스 쓰기 트랜잭션을 캐시 컨트롤러가 감시(스누핑)하여, DMA 쓰기 시 해당 캐시 라인을 무효화하고 DMA 읽기 시 캐시 내용을 메모리에 플러시(Flush)한다.
추가: * **소프트웨어 관리 (Non-coherent systems):** 운영체제가 나가는 DMA 전송 전 캐시 라인을 플러시하고, 들어오는 DMA 전송 후 해당 메모리 범위의 캐시 라인을 무효화한다. 이 동안 해당 메모리 범위에 어떤 스레드도 접근하지 못하도록 보장해야 한다. 하드웨어가 캐시 라인별 무효화 루프를 요구하므로 오버헤드가 발생한다.
추가: * **하이브리드:** L2 캐시는 하드웨어로 일관성 유지, L1 캐시(통상 CPU 내장)는 소프트웨어로 관리하는 혼합 방식도 존재한다.[2][3]
추가:
추가: ### 스캐터-개더 / 벡터드 I/O DMA
추가:
추가: 단일 DMA 트랜잭션으로 여러 개의 분리된 메모리 영역과 데이터를 주고받을 수 있는 기능이다. 여러 개의 단순 DMA 요청을 체이닝(Chaining)한 것과 동등하며, 다중 입출력 인터럽트와 데이터 복사 작업을 CPU에서 오프로드하는 것이 목적이다.[3]
추가:
추가: ## 사례
추가:
추가: ### ISA 버스 (Industry Standard Architecture)
추가:
추가: * **초기 PC/XT:** 인텔 8237 단일 칩, 4채널(0~3), 8비트 전송, 1MB 주소 공간 내 64KB 세그먼트 제한, 채널 0은 DRAM 리프레시 전용.
추가: * **PC/AT (ISA):** 8237 두 개로 7채널(0~3, 5~7, 4는 캐스케이드), 24비트 주소 버스로 16MB 접근, 상위 3채널 16비트 전송 지원. 여전히 64KB 세그먼트 경계 제한, 메모리-메모리 전송 실용성 낮음, 최대 전송률 8비트 ~0.9MB/s(PC/XT), 16비트 ~1.6MB/s(AT). 1980년대 후반 사실상 구식화.
추가: * **레거시 사용처:** 사운드 블라스터 카드(호환성), 슈퍼 I/O 내장 플로피/적외선/패러럴 포트 컨트롤러. 32비트 시스템에서도 처음 16MB 메모리로만 DMA 제한.[3]
추가:
추가: ### PCI 버스 (Peripheral Component Interconnect)
추가:
추가: * 중앙 DMA 컨트롤러 없음. 장치가 버스 마스터가 되어 PCI 버스 컨트롤러(호스트 브리지/PCI-to-PCI 브리지)에 버스 소유권 요청 → 중재 → 승인 시 메모리 읽기/쓰기 명령 직접 발행.
추가: * 최신 x86: 사우스브리지 → DMI → CPU 내장 메모리 컨트롤러 → DDR 버스 경유.
추가: * 32비트 주소 버스 장치는 4GB 이상 메모리 접근 불가. 해결: DAC(64비트 DMA 주소 지정, 버스와 장치 양쪽 지원 필요), 바운스 버퍼(이중 버퍼, 비용 큼), IOMMU 주소 변환 서비스.[3]
추가:
추가: ### I/OAT (I/O Acceleration Technology)
추가:
추가: 인텔 제온 칩셋에 내장된 DMA 엔진으로, 메인 CPU의 메모리 복사 연산(네트워크 트래픽 복사 등)을 오프로드하여 CPU를 다른 작업에 자유롭게 한다. 2006년 인텔 리눅스 커널 개발자 앤드루 그로버(Andrew Grover)가 I/OAT를 이용한 네트워크 트래픽 복사 오프로드 벤치마크를 수행한 바 있다.[3]
추가:
추가: ### 기타 버스 및 아키텍처
추가:
추가: * **EISA, MCA:** 32비트 주소 지정 지원, 전체 메모리 범위 접근 가능, ISA보다 고성능 DMA 서브시스템 탑재.
추가: * **AHB (Advanced High-performance Bus):** ARM 기반 SoC 등에서 사용되는 온칩 버스 표준으로 DMA 컨트롤러 및 버스 마스터링 지원.
추가:
추가: ## 규제·논란·평가
추가:
추가: ### 성능 한계와 세대 교체
추가:
추가: ISA 시대 8237 기반 DMA는 1.6MB/s 수준의 낮은 대역폭, 64KB 세그먼트 경계 미지원, 메모리 리프레시 간섭, CPU보다 느린 컨트롤러 클럭(4.77MHz 고정) 등으로 인해 80286/80386 CPU의 PIO 속도에도 미치지 못하는 병목이 되었다. 32비트 버스(EISA, MCA, PCI) 전환과 함께 하드웨어 가속 관점에서 DMA 컨트롤러 자체의 성능이 발목을 잡는 현상이 나타나, 레거시 하드웨어 지원용으로만 남게 되었다.[3]
추가:
추가: ### 주소 공간 제약과 64비트 전환 비용
추가:
추가: PCI 장치의 32비트 주소 버스는 x86-64 또는 PAE(36비트) 환경에서 4GB 이상 메모리(High Memory)에 직접 접근할 수 없다. 이를 우회하기 위한 바운스 버퍼(이중 버퍼)는 추가 메모리 복사 비용을 유발하며, DAC 메커니즘은 버스와 장치 양쪽의 하드웨어 지원이 필요해 범용 적용에 제약이 있다. IOMMU는 주소 변환으로 이 문제를 해결하지만, 페이지 테이블 워크와 TLB 관리 오버헤드가 추가된다. 이는 커널 드라이버 개발 시 DMA 매핑 API(dma_map_* 계열) 설계에 지속적인 영향을 미친다.[3]
추가:
추가: ### 캐시 일관성 관리 오버헤드
추가:
추가: 비일관성(Non-coherent) 시스템에서 소프트웨어가 캐시 플러시/무효화를 책임져야 하는 구조는 DMA 전송마다 루프 단위 캐시 연산을 요구하여 지연 시간과 CPU 사이클을 소모한다. 하드웨어 일관성(버스 스누핑) 방식은 버스 대역폭을 일부 점유한다. 임베디드 및 SoC 설계 시 L1/L2 캐시 계층별 일관성 정책 선택은 성능과 복잡도의 트레이드오프가 된다.[2][3]
추가:
추가: ### 보안 및 격리 이슈 (IOMMU 연관)
추가:
추가: DMA 장치가 물리 메모리 전체에 자유롭게 접근할 수 있다는 점은 보안 취약점으로 작용할 수 있다. 악의적이거나 버그가 있는 장치 드라이버/펌웨어가 DMA를 통해 커널 메모리나 타 프로세스 메모리를 훔쳐보거나 변조할 수 있다. 현대 OS는 IOMMU를 활용해 장치별 DMA 주소 공간을 격리(DMA 보호 도메인)하고, 신뢰할 수 있는 장치에만 최소한의 매핑을 허용하는 방향으로 진화했다. 이는 커널 레벨 안티치트(Kernel-level anti-cheat)나 가상화 I/O 장치 할당(VT-d, AMD-Vi)에서도 핵심 기반 기술이다.[3]
추가:
추가: ### 특허 역사
추가:
추가: DMA는 과거 IBM의 특허 기술이었으나 현재는 특허권이 소멸되어 누구나 자유롭게 구현할 수 있는 공개 기술이 되었다.[2]
추가:
추가: ## 관련 기술 및 비교
추가:
추가: * **프로그램 입출력 (PIO, Programmed I/O):** DMA의 반대 개념. 장치 간 전송되는 모든 데이터가 CPU 레지스터를 거쳐 간다. CPU가 전송 전체 시간 동안 점유되어 다른 작업 불가. DMA는 PIO의 단점을 보완하기 위해 고안됨.[2]
추가: * **원격 직접 메모리 접근 (RDMA, Remote Direct Memory Access):** 네트워크를 통해 원격 호스트의 메모리에 CPU 개입 없이 직접 접근하는 기술. 인피니밴드(InfiniBand), RoCE, iWARP 등에서 사용.
추가: * **입출력 채널 (I/O Channel):** 메인프레임 등에서 CPU와 독립적으로 입출력을 수행하는 별도 프로세서 채널 아키텍처. DMA의 개념적 선조.
추가: * **메모리 맵 입출력 (MMIO, Memory-Mapped I/O):** 장치 레지스터를 메모리 주소 공간에 매핑하여 CPU가 일반 메모리 접근 명령으로 장치 제어. DMA와 별개이나 종종 함께 사용.
추가: * **하드웨어 가속 (Hardware Acceleration):** DMA는 데이터 이동 가속화 수단으로 하드웨어 가속의 한 축을 이룸.
추가: * **IOMMU (Input-Output Memory Management Unit):** DMA 주소 변환 및 격리 제공. 가상화, 보안, 64비트 주소 확장 해결에 필수.
추가: * **폴링 (Polling) / 인터럽트 (Interrupt):** DMA 완료 통지 또는 장치 상태 확인 방식. DMA 전송 완료 시 인터럽트 방식이 일반적.
추가: * **블리터 (Blitter):** 메모리-메모리 고속 복사/비트 연산 전용 하드웨어. 초기 PC에서 DMA 컨트롤러(8237 채널 0, 1)가 블리터 역할을 시도했으나 성능 한계로 실패함.[3]
추가:
추가: 이 문서는 GGWiki AI가 공개 자료(아래 출처)를 조사해 새로 쓴 초안입니다. 틀린 내용은 편집하거나 이의 제기로 알려 주세요.

편집 요청

편집 요청이 없어요.