Skip to the content.

DC, DMB, DSB

example

이번 친구들은 CPU와 메모리, 그리고 캐시(Cache) 사이의 복잡한 하드웨어 교통정리를 담당하는 깊숙한 영역의 명령어들입니다. 운영체제(OS) 커널이나 시스템 드라이버를 만드는 개발자가 아니면 평생 한 번 볼까 말까 한 어려운 녀석들이죠.


DC

Data Cache operation (데이터 캐시 청소부)

💡 왜 필요한가요? (비유)

CPU는 똑똑하고 빨라서, 저 멀리 있는 메인 메모리(RAM)까지 가기 귀찮아합니다. 그래서 자주 쓰는 데이터를 자기 바로 옆 주머니인 ‘캐시 메모리’에 넣어두고 씁니다. 그런데 주변 장치(예: 그래픽 카드나 네트워크 카드)가 메인 메모리(RAM)의 데이터를 직접 수정해 버렸다면? CPU는 그 사실을 모르고 자기 주머니(캐시)에 있는 낡은 데이터를 계속 쓸 수 있습니다. 혹은 반대로 CPU가 주머니에만 새 데이터를 적어두고 RAM에는 아직 안 보냈을 수도 있죠. 이때 DC 명령어를 내려서 “주머니에 있는 거 당장 RAM에 집어넣어!(Clean)” 혹은 “주머니에 있는 거 낡았으니까 다 버리고 RAM에서 새로 읽어와!(Invalidate)”라고 명령하는 것입니다.

DC CIVAC, X0 ; X0 주소에 해당하는 캐시 라인을 강제로 청소(Clean)하고 비워라(Invalidate)!


DMB

Data Memory Barrier (데이터 통행 제한 표지판)

💡 왜 필요한가요? (비유)

현대 CPU는 속도를 높이기 위해, 자기 마음대로 코드의 실행 순서를 앞뒤로 바꿉니다(Out-of-order execution). 예를 들어 A 마트에서 물건 사고 B 마트에서 물건 사는 코드가 있다면, CPU가 보기에 B 마트가 더 가까우면 B 마트부터 들렀다 오는 식이죠. 혼자 일할 때는 아무 문제가 없습니다. 하지만 멀티코어(CPU 코어가 여러 개) 환경이라면 대참사가 날 수 있습니다.

그런데 1번 코어의 CPU가 똑똑한 척하느라 Flag=1로 바꾸는 작업을 가구 조립(Data)보다 먼저 처리해 버린다면? 2번 코어는 조립도 안 된 가구를 가져가서 에러가 납니다. 이때 두 명령어 사이에 DMB 바리케이드를 치는 것입니다.

STR X0, [X1] ; 가구 조립 데이터 저장 DMB ISH ; ⛔ 바리케이드! 이 이전의 모든 메모리 작업이 끝날 때까지 절대 넘어가지 마라! STR W2, [X3] ; 완료 플래그(Flag=1) 저장

DMB를 만나면 CPU는 절대로 이 선을 넘어 명령어 순서를 뒤집지 못합니다. 안전한 데이터 교환을 위한 교통 표지판인 셈이죠.

DSB

Data Synchronization Barrier (데이터 작업 완료 대기소)

💡 DMB와 무엇이 다른가요?

보통 하드웨어 장치를 제어하는 드라이버 코드에서, 장치에 명령을 내린 뒤 그 명령이 하드웨어 칩에 완전히 도달해서 반영된 것을 백프로 보장받고 다음 단계로 넘어가야 할 때 사용합니다. 아주 무겁고 강력한 바리케이드죠.

STR X0, [X1] ; 하드웨어 컨트롤러에 명령 전달 DSB SY ; 🛑 정지! 위의 하드웨어 쓰기 작업이 완벽하게 끝날 때까지 CPU 동작 일시 정지! ADD X2, X2, #1 ; 그 후에야 다음 줄 연산 시작


🧱 눈높이 맞춤 교본용 요약 판넬

니모닉 이름 쉽게 이해하는 역할 주 사용처
DC Data Cache operation CPU 주머니(캐시)와 실제 창고(RAM)의 데이터 싱크 맞추기/청소하기 드라이버 개발, 메모리 관리
DMB Data Memory Barrier 멀티코어 환경에서 명령어 읽기/쓰기 순서 뒤바뀜 방지 (통행 제한) 멀티스레드 동기화 (Lock 구현)
DSB Data Synchronization Barrier 앞의 메모리 작업이 하드웨어적으로 끝날 때까지 CPU 다음 코드 진행 차단 (완전 정지) 주변 장치(I/O) 제어, 시스템 부팅