Direct Memory Access (DMA) Mechanics
CPU의 개입 없이 주변 장치와 메모리 간에 대량의 데이터를 물리적으로 전송하여 시스템 처리 효율을 극대화하는 DMA 컨트롤러의 작동 원리를 다루는 학습 노드입니다.
Article
M
Me
hyunyoun's Blog
computer-architecture-embedded-systemscomputer-architectureembedded-systemshardware-software-interface-physicsdirect-memory-access-dma-mechanicslearningmmiodma10 min read
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가 이를 차단할 때의 예외 시퀀스를 기술할 수 있는 가?