OS와 하드웨어

위와 같이 장치의 상태 레지스터를 메모리 맵 I/O로 읽을 때 volatile을 붙이고 그 영역을 캐시하지 않도록 설정하는 이유로 올바른 것은 무엇입니까?

#define STATUS (*(volatile unsigned int *)0x40001000)
while ((STATUS & 1) == 0)
    ;   /* 장치가 준비될 때까지 기다린다 */
  1. Avolatile을 붙이면 읽기 명령이 한 번으로 합쳐져 빨라지기 때문에
  2. B캐시에 넣으면 장치 레지스터의 값이 자동으로 0으로 돌아가기 때문에
  3. C값은 장치가 바꾸므로 매번 실제로 다시 읽지 않으면 변화를 놓치기 때문에
정답과 해설 보기

정답: C. 값은 장치가 바꾸므로 매번 실제로 다시 읽지 않으면 변화를 놓치기 때문에

장치 레지스터의 값은 프로그램과 무관하게 장치가 바꿉니다. volatile이 없으면 컴파일러는 루프 안에서 값이 변하지 않는다고 판단하여 한 번만 읽고 영원히 기다리는 코드를 만들 수 있습니다. 또한 그 영역을 캐시하면 CPU는 캐시에 있는 오래된 값을 계속 읽게 되어 장치의 변화가 보이지 않습니다. volatile은 읽기를 생략하지 못하게 하는 지정으로, 한 번으로 합치는 것과는 반대 작용입니다. 캐시 때문에 값이 0이 되는 일도 없습니다.

  • A. volatile은 읽기의 생략을 금지하는 것으로, 합치는 것과는 반대입니다.
  • B. 캐시해도 값이 0으로 돌아가는 일은 없습니다.
  • C. 올바릅니다. 장치가 값을 바꾸므로 매번 실제로 읽어야 합니다.
이 분야 연습하기 분야로 돌아가기

OS와 하드웨어의 다른 문제

  1. 장치의 상태를 인터럽트를 쓰지 않고 CPU가 반복해서 조사하는 방식(폴링)이 유리한 경우는 무엇입니까?
  2. 캐시 일관성을 하드웨어가 유지하지 않는(비코히런트) 시스템에서, 장치가 DMA로 주기억장치에 쓴 데이터를 CPU가 읽기 전에 소프트웨어가 해야 하는 처리는 무엇입니까?
  3. IOMMU의 주된 역할로 올바른 것은 무엇입니까?
  4. 디바이스 드라이버의 역할로 올바른 것은 무엇입니까?
  5. 일반적인 OS에서 애플리케이션이 장치의 레지스터를 직접 읽고 쓰지 못하게 하는 주된 이유는 무엇입니까?

이 분야의 비교