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

v6.18.37 / arch/arm64/include/asm/barrier.h

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

## 일반 메모리 및 DMA barrier 정의

```c

#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)

```

### 63행

```c

#define __mb()		dsb(sy)

```

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

### 64행

```c

#define __rmb()		dsb(ld)

```

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

### 65행

```c

#define __wmb()		dsb(st)

```

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

### 67행

```c

#define __dma_mb()	dmb(osh)

```

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

### 68행

```c

#define __dma_rmb()	dmb(oshld)

```

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

### 69행

```c

#define __dma_wmb()	dmb(oshst)

```

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