Linux v6.18.37 · 개념과 코드 읽기

Cache coherency와 memory barrier: DMB/DSB, x86 ordering, FENCE

이 코드는 어떤 문제를 푸나요?

CPU A가 데이터부터 쓰고 완료 표시를 나중에 써도, 다른 관찰자가 그 순서를 그대로 보도록 보장하는 규칙은 필요합니다. arm64의 DMB·DSB·ISB, x86의 순서 모델과 fence, RISC-V의 FENCE는 역할과 범위가 같지 않습니다. 여기서는 arm64가 일반 메모리와 DMA용 장벽을 어떻게 정의하는지 읽습니다.

읽을 범위: v6.18.37 · arch/arm64/include/asm/barrier.h · 일반 메모리 및 DMA barrier 정의 63–69행입니다. 아래에 이 범위의 원문과 각 줄의 설명을 실었습니다. 주제 전체의 흐름과 다른 경로는 기존 분석에서 함께 읽으실 수 있습니다.

먼저 알아둘 개념

순서와 완료

DMB는 요구한 메모리 접근 순서를 만들고 DSB는 해당 범위의 완료 조건까지 기다립니다. ISB는 명령 실행 환경 변경을 이후 명령에 반영하는 역할입니다.

공유 범위

ish와 osh는 각각 inner-shareable 및 outer-shareable 범위를 선택합니다. 단순히 빠른 장벽과 느린 장벽이라는 뜻이 아닙니다.

memory clobber

인라인 어셈블리가 메모리에 영향을 준다고 컴파일러에 알립니다. 컴파일러 재배치를 제한하는 조건과 CPU 장벽을 함께 읽어야 합니다.

처음 읽을 때

데이터와 완료 표시를 서로 다른 두 상자로 그려 어느 관찰자가 어느 순서로 봐야 하는지 설명해 보십시오.

더 깊이 살펴볼 때

장치 MMIO, DMA 버퍼, CPU 간 일반 메모리에서 같은 장벽을 쓸 수 없는 이유를 검토해 보십시오.

그림으로 보는 변화

Cache coherency와 memory barrier: DMB/DSB, x86 ordering, FENCE의 단계별 개념 그림
각 단계에 화살표 의미와 생략 범위를 표시했습니다. 주소·숫자 예제는 실제 장치 값을 뜻하지 않습니다.
1단계 설명

1단계 고정

GIF 원본 열기

1. 접근 생성

컴파일러가 load와 store를 배치합니다.

화살표는 메모리 접근이 생성되는 과정입니다.

2. 범위에 맞는 장벽

CPU 간 공유와 DMA 관찰 범위를 구분합니다.

장벽은 데이터 복사가 아니라 관찰 순서 또는 완료 조건을 부여합니다.

3. 관찰자 확인

다른 CPU 또는 장치가 정해진 순서로 데이터를 읽습니다.

관찰 대상이 누구인지가 장벽 선택의 일부입니다.

일반 메모리 및 DMA barrier 정의를 한 줄씩 읽기

줄 번호는 v6.18.37 원문 기준입니다. 주석·빈 줄을 포함한 함수 전체를 먼저 보고, 그 아래에서 각 줄을 설명합니다.

#define __mb()		dsb(sy)
#define __rmb()		dsb(ld)
#define __wmb()		dsb(st)

#define __dma_mb()	dmb(osh)
#define __dma_rmb()	dmb(oshld)
#define __dma_wmb()	dmb(oshst)
#define __mb()		dsb(sy)

일반 전면 메모리 장벽 __mb를 DSB SY로 정의합니다. 접근 종류를 한쪽으로 제한하지 않고 system 범위의 DSB 의미를 사용합니다.

#define __rmb()		dsb(ld)

일반 읽기 장벽은 DSB LD를 사용합니다. load 관련 순서·완료 조건을 명령 옵션으로 선택합니다.

#define __wmb()		dsb(st)

일반 쓰기 장벽은 DSB ST를 사용합니다. 앞선 store 완료가 필요한 문맥을 위한 정의입니다.

#define __dma_mb()	dmb(osh)

DMA 전면 장벽은 DMB OSH입니다. 외부 공유 범위의 메모리 관찰 순서를 다루며 데이터 자체를 복사하거나 캐시를 모두 비우지 않습니다.

#define __dma_rmb()	dmb(oshld)

DMA 읽기 장벽은 DMB OSHLD입니다. 장치가 공개한 데이터와 CPU 읽기 사이의 순서에 쓰이는 정의입니다.

#define __dma_wmb()	dmb(oshst)

DMA 쓰기 장벽은 DMB OSHST입니다. 장치에 데이터를 공개하는 store들의 순서를 다룹니다. 위 DSB 계열과 완료 의미를 구분해야 합니다.

함께 생각해 볼 질문

장벽을 넣으면 캐시가 모두 비워집니까?

아닙니다. 순서 제어와 캐시 clean/invalidate는 다른 작업입니다.

x86에는 장벽이 필요 없습니까?

아닙니다. x86도 컴파일러 재배치, 특정 메모리 유형, 장치 접근 및 명시적 순서 요구를 따져야 합니다.

ISB로 DMA 쓰기 완료를 기다립니까?

아닙니다. ISB의 목적은 명령 스트림 동기화이며 DMA 완료 조건을 대신하지 않습니다.

출처와 읽은 범위

Linux stable v6.18.37 · arch/arm64/include/asm/barrier.h

해당 버전 원본 파일 · 기존 코드 분석 · 설명 원고

맨 위로 ↑