Direct Memory Access (DMA) Mechanics
CPU의 개입 없이 주변 장치와 메모리 간에 대량의 데이터를 물리적으로 전송하여 시스템 처리 효율을 극대화하는 DMA 컨트롤러의 작동 원리를 다루는 학습 노드입니다.
목차 보기22
1. Overview
직접 메모리 접근 메커니즘(Direct Memory Access Mechanics, DMA)은 센서에서 쏟아지는 데이터를 램(RAM)으로 나르느라 CPU가 헛고생(Polling/Interrupt)하는 것을 막기 위해, CPU의 멱살을 풀고 버스(Bus)의 지배권을 대신 가로채어 백그라운드에서 데이터를 폭풍처럼 퍼 나르는 하드웨어 하청(Outsourcing)의 물리학입니다.
학습자는 CPU와 DMA 컨트롤러가 마더보드의 유일한 도로(System Bus)를 두고 눈치 게임을 벌이는 **버스 아비트레이션(Bus Arbitration)**을 뜯어보고, 사이클 스틸링(Cycle Stealing)과 버스트 모드(Burst Mode) 전송의 기하학을 해부합니다. 나아가 배열의 끝에 도달하면 메모리 주소를 다시 처음으로 꺾어버리는 원형 버퍼(Circular Buffer/Ring Buffer) 역학과 핑퐁(Ping-Pong) 더블 버퍼링 기술을 통달하여, 오디오 스트리밍이나 고속 디스플레이(LCD)의 끊김 없는 실시간 데이터 파이프라인을 구축하는 하드웨어 설계 역량을 확보합니다.
2. Scope & Boundaries
In-Scope
- DMA 하드웨어 역학 (DMA Physics): DMA 컨트롤러(DMAC), 버스 마스터링(Bus Mastering), 소스/데스티네이션 주소(Source/Destination Address), 전송 크기 제어.
- 버스 권한 스위칭 (Bus Arbitration): 사이클 스틸링(Cycle Stealing), 버스트 모드(Burst Mode), 투명 모드(Transparent Mode).
- 데이터 버퍼링 궤적 (Buffering Topologies): 더블 버퍼링(Ping-Pong Buffer), 원형(Circular) 링 버퍼, 절반 전송/전체 전송 인터럽트(Half/Full Transfer Complete).
- 인터페이스 매핑 (Peripheral to Memory): ADC → SRAM, SRAM → SPI/UART 등 메모리와 하드웨어 간 매핑 구조.
Out-of-Scope
- 캐시 일관성 (Cache Coherence): DMA가 램(RAM) 값을 몰래 바꿔놨는데 CPU의 L1 캐시는 옛날 값을 쥐고 있어 발생하는 불일치(Stale Data) 문제 → 02-02-02. Cache Coherence & MESI 영역.
- IOMMU와 메모리 보호: 악의적 PCIe 장치가 DMA로 커널 영역을 훔쳐가는 것을 막는 물리적 게이트 → 02-04-03. Hardware Security & Enclaves 영역.
Boundaries
- DMA vs. Interrupts (02-05-03): 인터럽트(02-05-03)가 "데이터가 도착할 때마다 CPU를 1번씩 깨워 귀찮게 굴면서 문맥 전환(Context Switch)의 피를 말리는 방식"이라면, DMA는 "데이터가 1만 개 도착할 때까지 CPU를 푹 재워놓고, 혼자 버스를 털어 램에 다 채운 뒤 마지막에 단 1번만 CPU를 깨우는 극강의 스루풋(Throughput) 오토파일럿"입니다.
3. Counterexample
- DMA 셋업의 포인터 붕괴 (Stale Pointer Fallacy): DMA 데스티네이션(목적지) 주소로 C 언어의 힙(Heap) 포인터나 스택(Stack) 지역 변수의 주소를 던져버리는 파멸적 실수. 지역 변수는 함수가 끝나면(Return) 증발해 버리는데, 백그라운드에 켜져 있는 DMA 하드웨어는 그런 소프트웨어의 사정을 모르고 계속 그 허공(증발한 스택 영역)에 1만 개의 데이터를 쏟아붓습니다. 결국 스택이 모조리 파괴되며 시스템은 세그멘테이션 폴트를 띄우고 즉사합니다.
- CPU 버스 독점 무지 (Bus Starvation): DMA를 버스트(Burst) 모드로 세팅해 놓고 엄청난 양의 영상 데이터를 램에 부을 때, DMA 컨트롤러가 시스템 버스를 100% 독점(Mastering)해버려 CPU가 명령어(Instruction)조차 메모리에서 읽어오지 못하고 숨통이 끊기는 현상. 버스 아비터(Arbiter)의 우선순위를 조율하거나 사이클 스틸링 모드를 섞어 CPU가 최소한 숨은 쉴 수 있게 열어주지 않으면, 인터럽트조차 처리 못 하는 끔찍한 먹통 딜레이가 발생합니다.
4. Prerequisites
- 메모리 맵 I/O (Basic): DMA가 데이터를 퍼 나르기 위해 출발지와 도착지의 하드웨어 주소를 정확히 포인터로 찍어주어야 하므로, 칩 내부의 메모리 맵(02-05-01)을 장악하고 있어야 합니다.
- 버스와 클럭 도메인 (Recommended): CPU, 램, 주변 기기를 연결하는 데이터 버스(Bus)가 본질적으로 1차선 도로라는 물리적 인식이 필요합니다. (02-01-02 IFR)
5. Learning Map
6. Learning Topics
Basic
Core Topic 01: CPU 해방 선언, DMA 하청 역학 (DMA Out-sourcing)
- Why to Learn: 오디오 칩에서 1초에 4만 4천 번(44.1kHz) 데이터가 쏟아질 때, CPU가 이걸 일일이 램에 복사하느라 정작 중요한 AI 알고리즘 연산을 1%도 못 돌리는 절망적 병목을 박살 내기 위함입니다.
- What to Learn:
- Concepts: DMAC(DMA Controller), 주변장치-메모리(Peripheral to Memory) 맵핑.
- Skills: 소스 주소 설정(SRC), 목적지 주소 설정(DST), 전송 카운트(Size), 주소 자동 증가(Increment).
- Tools: DMA 채널 및 스트림 레지스터.
- Trade-offs: CPU가 직접 루프문(
for)을 돌려 복사하면 칩 구조가 단순하고 디버깅이 쉽지만 연산력이 바닥을 기는 함정 vs DMA 세팅을 위해 레지스터 수십 개를 뚫어야 하는 끔찍한 진입장벽을 넘으면 CPU 0% 점유율로 메가바이트 데이터를 나르는 기적의 아키텍처.
- How to Learn:
- 1단계: ADC 레지스터 주소(
0x40012000)에 값이 업데이트(변화)될 때마다, DMA가 하드웨어 트리거를 받고 그 값을 스루풋 손실 없이 배열 번지(0x20001000)로 떠가는 1<1>1> 하청 복사 궤적을 해부합니다. - 2단계: 배열을 채울 때, 소스(ADC) 주소는 고정시키고(Fixed) 목적지(RAM) 주소는 전송할 때마다 +4 바이트씩 강제로 증가(Increment)시키도록 포인터 물리 엔진을 세팅하는 꼼수를 뜯어봅니다.
- 1단계: ADC 레지스터 주소(
- Implement: 번의 복사를 수행할 때 CPU가 1개씩
load/store명령어를 치는 사이클 수와, DMA 셋업에 10명령어를 투자하고 백그라운드 스루풋으로 처리하는 사이클 수를 비교하여, 이 커질수록 DMA의 시간 절약(Saving)이 선형적으로 폭발하는 텍스트 시각화 시뮬레이터.
Recommended
Core Topic 02: 1차선 멱살잡이, 버스 아비트레이션 물리학 (Bus Arbitration)
- Why to Learn: 칩 안에 길(System Bus)은 하나인데 버스를 장악하려는 마스터(CPU와 DMAC)는 두 명일 때, 누가 길을 쓸 것인지 조율하지 않으면 칩이 완전히 정지(Halt)해버리는 물리적 충돌을 통제하기 위해서입니다.
- What to Learn:
- Concepts: 버스 마스터(Bus Master), 슬레이브(Slave), 아비터(Arbiter).
- Skills: 사이클 스틸링(Cycle Stealing), 버스트 모드(Burst Mode).
- Tools: 버스 매트릭스 다이어그램(Bus Matrix).
- Trade-offs: DMA가 1000개 데이터를 옮길 때 버스를 한 번에 독점(Burst Mode)하면 전송은 미친 듯이 빠르지만 CPU가 1000클럭 동안 아무 짓도 못 하고 얼어붙는 지옥 vs CPU가 메모리를 안 쓰는 미세한 찰나(명령어 디코드/실행)에만 DMA가 버스를 한 클럭 훔쳐다 쓰는 사이클 스틸링(Cycle Stealing)은 시스템 반응성은 쩔지만 DMA 전송 속도가 반 토막 나는 우아한 타협.
- How to Learn:
- 1단계: CPU가 버스 소유권을 DMA에게 넘겨주기 위해
Hold/Hold_Acknowledge하드웨어 핀 핑퐁을 거치며 스스로 명령어 페치(Fetch)를 멈추고 램(RAM) 접근을 차단당하는 복종의 순간을 해부합니다. - 2단계: 멀티 레이어 버스 매트릭스(AHB/AXI)를 도입하여, CPU는
SRAM1에서 연산을 하고 DMA는SRAM2에 데이터를 채우는 식으로 아예 각자의 차선(도로)을 찢어 충돌 자체를 소멸시켜버리는 하드웨어 교차로 배관 공학을 뜯어봅니다.
- 1단계: CPU가 버스 소유권을 DMA에게 넘겨주기 위해
- Implement: 1차선 큐(Bus)를 두고 CPU 스레드와 DMA 스레드가
Lock을 다투는 코드 모사. DMA가Lock을 한 번 잡고 1000루프를 싹 다 돌려버리는 멍청한 버스트(Burst) 모드와,yield()를 통해 CPU와 교대로 1틱씩 나눠 쓰는 스틸링(Stealing) 모드에서 CPU의 태스크 딜레이(Delay) 차이를 증명.
Practical
Core Topic 03: 핑퐁의 마법, 더블 버퍼링 동기화 (Ping-Pong Buffering)
- Why to Learn: DMA가 배열 크기 끝까지 데이터를 다 나르고 나서 "야 CPU 나 끝났어(Interrupt)"라고 멈추는 그 수십 마이크로초의 찰나 동안, 들어오던 센서 데이터가 갈 곳을 잃고 공중에서 증발해 버리는(Loss) 파이프라인 단절을 틀어막기 위함입니다.
- What to Learn:
- Concepts: 더블 버퍼링(Double Buffering), 핑퐁 버퍼(Ping-Pong).
- Skills: 절반 전송 인터럽트(Half-Transfer Complete), 전체 전송 인터럽트(Full-Transfer Complete).
- Tools: 오디오 스트리밍 / LCD 프레임버퍼.
- Trade-offs: 버퍼 크기를 1MB 통째로 크게 잡으면 DMA 세팅 빈도가 줄어 CPU는 편해지지만 데이터 처리에 1초씩 레이턴시(랙)가 걸리는 둔감함 vs 버퍼를 1KB로 잘게 쪼개어 더블 버퍼링을 치면 실시간성(Real-Time)은 극한으로 오르나 핑퐁 인터럽트 오버헤드가 CPU를 갉아먹는 균형.
- How to Learn:
- 1단계: 배열(Buffer)을 절반(A 파트, B 파트)으로 논리적으로 찢고, DMA가 A 파트를 다 채우면(Half-Complete Interrupt 발동) CPU는 A 파트의 데이터를 씹고 뜯고 맛보는 동안 DMA는 멈추지 않고 즉시 B 파트를 이어서 채우는 무정지 컨베이어 벨트를 해부합니다.
- 2단계: B 파트마저 다 채워지면(Full-Complete Interrupt), 이번엔 CPU가 B 파트로 달려가 분석하고 DMA는 다시 A 파트를 덮어쓰는 영구 기관(Ping-Pong) 물리를 뜯어봅니다.
- Implement: 20칸짜리 배열 버퍼(List)를 두고 백그라운드 DMA 스레드가 1초에 1칸씩 인덱스를 전진하며 값을 씁니다. 인덱스가 9(Half)에 도달하면
Event_A를 쏴서 CPU가 09를 분석(출력)하게 하고, 인덱스 19(Full)에 도달하면19를 분석하게 만들며 절대 서로의 공간을 동시에 침범(Race)하지 않는 논-블로킹 로직 구현.Event_B를 쏴 10
Advanced
Core Topic 04: 무한궤도와 스캐터-개더 배열의 파편화 극복 (Scatter-Gather)
- Why to Learn: 램(RAM)의 용량이 턱없이 부족할 때, 메모리에 흩어져 파편화된 데이터 블록들을 DMA가 알아서 체인(Chain)처럼 연결해 한 방에 퍼 나르는 하드웨어 레벨의 링크드 리스트(Linked-List) 역학을 장악하기 위해서입니다.
- What to Learn:
- Concepts: 원형 버퍼(Circular/Ring Buffer), 스캐터-개더(Scatter-Gather) DMA.
- Skills: 링크드 리스트 디스크립터(Descriptor) 체이닝(Chaining), 포인터 자동 래핑(Wrapping).
- Tools: 네트워크 패킷(MAC) 조립.
- Trade-offs: 기본 원형 버퍼(Circular)는 연속된 물리 주소 하나만 빙글빙글 돌아서 하드웨어 구현이 껌이지만 빈 조각 메모리(Fragmentation)를 못 쓰는 한계 vs 스캐터-개더는 DMA 컨트롤러에게 메모리 디스크립터(다음 조각 주소가 적힌 지도)를 던져주어 흩어진 메모리를 완벽히 조립하지만 셋업 복잡도가 지옥으로 치솟는 절망.
- How to Learn:
- 1단계: 원형 버퍼: DMA 포인터가 배열의 최상단(Length - 1)에 도달하는 순간, 하드웨어 회로가 주소 포인터를
Length만큼 빼버려(0번지 회귀) 소프트웨어 개입 없이 무한 루프 궤도를 생성하는 물리를 해부합니다. - 2단계: 스캐터-개더: 네트워크 칩에서 이더넷 헤더는 메모리 A번지에 있고, 진짜 데이터는 B번지에 있을 때, CPU가 램을 이리저리 카피(Copy)해서 합치는 무식한 짓을 막고 DMA 디스크립터 체인(A 싣고 → 다 되면 자동으로 B 주소 읽어서 마저 싣기)으로 메모리를 흩뿌리고 모으는 기하학을 뜯어봅니다.
- 1단계: 원형 버퍼: DMA 포인터가 배열의 최상단(Length - 1)에 도달하는 순간, 하드웨어 회로가 주소 포인터를
- Implement: 원형 큐(Ring Buffer)와 스캐터-개더 디스크립터 리스트 2가지 모드를 파이썬 객체로 시뮬레이션. 스캐터-개더 모드에서
Descriptor = {src, dest, len, next_descriptor_ptr}구조체를 DMA 컨트롤러에 던져주면, 컨트롤러 루프가 포인터를 따라가며 여러 떨어진 문자열 파편들("Hel","lo ","DMA!")을 연속된 하나의 배열"Hello DMA!"로 엮어내는(Gather) 궤적 출력.
7. Terminology
8. References
Primary
- [P1] CS2023 - AR/Embedded Systems & I/O — Detailed DMA requirements.
- [P2] SWEBOK v4.0 - Computing Foundations / I/O and DMA — Structural standards.
Secondary
- [Operating System Concepts] Silberschatz — DMA interface with OS.
- [Computer Systems: A Programmer's Perspective] Bryant & O'Hallaron — Cache & DMA interactions.
Industry
- [ARM AMBA AXI/AHB Specifications] — The bus standard for DMA.
- [Intel 8237 DMA Controller Datasheet] — The classic hardware reference.
9. Final Checklist
Primary
- DMA가 전송을 시작하기 위해 CPU로부터 받아야 하는 3가지 핵심 정보(시작주소, 목적지, 개수)가 왜 물리 레지스터여야 하는지 설명 가능한가? (P1)
- DMA 전송이 완료된 후, CPU가 일을 그만하고 결과를 확인하게 만드는 하드웨어 신호(Interrupt)의 물리적 전달 경로를 사상할 수 있는 가? (P1)
Secondary
- 'Burst Mode' DMA 전송이 진행되는 동안, CPU가 자신의 내부 캐시에만 있는 명령어를 실행하는 것은 왜 가능한지 버스 공유 관점에서 소통 가능한가?
- 100MB의 데이터를 옮길 때, 'Single mode'와 'Block mode' 중 어떤 방식이 시스템 전체의 **Latency(지연 시간)**를 더 안정적으로 유지하는지 입증 가능한가?
Industry
- 고성능 네트워크 카드(NIC) 설계 시, CPU 부하를 줄이기 위해 'Interrupt Coalescing'과 DMA를 어떻게 물리적으로 결합할지 제안할 수 있는 가? (SFIA)
- 임베디드 시스템에서 DMA가 메모리 범위를 벗어나 데이터를 쓰는 Buffer Overflow 발생 시, 하드웨어 MPU가 이를 차단할 때의 예외 시퀀스를 기술할 수 있는 가?
태그
dmabus-masteringdata-transferinterrupt-coalescingcycle-stealingdirect-memory-access-dma-mechanicsarchitecture-hardwarecomputer-architectureembedded-systemshardware-software-interface-physicsdirectmemorymmio