OS와 하드웨어
위와 같이 장치의 상태 레지스터를 메모리 맵 I/O로 읽을 때 volatile을 붙이고 그 영역을 캐시하지 않도록 설정하는 이유로 올바른 것은 무엇입니까?
#define STATUS (*(volatile unsigned int *)0x40001000)
while ((STATUS & 1) == 0)
; /* 장치가 준비될 때까지 기다린다 */
- Avolatile을 붙이면 읽기 명령이 한 번으로 합쳐져 빨라지기 때문에
- B캐시에 넣으면 장치 레지스터의 값이 자동으로 0으로 돌아가기 때문에
- C값은 장치가 바꾸므로 매번 실제로 다시 읽지 않으면 변화를 놓치기 때문에
정답과 해설 보기
정답: C. 값은 장치가 바꾸므로 매번 실제로 다시 읽지 않으면 변화를 놓치기 때문에
장치 레지스터의 값은 프로그램과 무관하게 장치가 바꿉니다. volatile이 없으면 컴파일러는 루프 안에서 값이 변하지 않는다고 판단하여 한 번만 읽고 영원히 기다리는 코드를 만들 수 있습니다. 또한 그 영역을 캐시하면 CPU는 캐시에 있는 오래된 값을 계속 읽게 되어 장치의 변화가 보이지 않습니다. volatile은 읽기를 생략하지 못하게 하는 지정으로, 한 번으로 합치는 것과는 반대 작용입니다. 캐시 때문에 값이 0이 되는 일도 없습니다.
- A. volatile은 읽기의 생략을 금지하는 것으로, 합치는 것과는 반대입니다.
- B. 캐시해도 값이 0으로 돌아가는 일은 없습니다.
- C. 올바릅니다. 장치가 값을 바꾸므로 매번 실제로 읽어야 합니다.