OSとハードウェア

上のように装置の状態レジスタをメモリマップドI/Oで読むとき、volatileを付け、その領域をキャッシュしない設定にする理由として正しいものはどれか。

#define STATUS (*(volatile unsigned int *)0x40001000)
while ((STATUS & 1) == 0)
    ;   /* 装置の準備ができるまで待つ */
  1. Avolatileを付けると、読み出しの命令が1回だけにまとめられ、速くなるから
  2. Bキャッシュに入れると、装置のレジスタの値が自動的に0に戻るから
  3. C値は装置が変えるので、毎回実際に読み直さないと変化を見逃すから
答えと解説を見る

正解:C. 値は装置が変えるので、毎回実際に読み直さないと変化を見逃すから

装置のレジスタの値はプログラムとは無関係に装置が書き換えます。volatileがないと、コンパイラはループの中で値が変わらないと判断して1回だけ読み、永久に待ち続けるコードを作ることがあります。また、その領域をキャッシュすると、CPUはキャッシュにある古い値を読み続け、装置の変化が見えません。volatileは読み出しを省略させないための指定で、1回にまとめるのとは逆の働きです。キャッシュで値が0になることもありません。

  • A. volatileは読み出しの省略を禁じるもので、まとめるのとは逆です。
  • B. キャッシュしても値が0に戻ることはありません。
  • C. 正しい。装置が値を変えるので、毎回実際に読む必要があります。
この分野を解く 分野ページへ

OSとハードウェアのほかの問題

  1. 装置の状態を、割り込みを使わずにCPUが繰り返し調べる方式(ポーリング)が有利になる場合はどれか。
  2. キャッシュの一貫性をハードウェアが保たない(非コヒーレントな)システムで、装置がDMAで主記憶に書き込んだデータをCPUが読む前に、ソフトウェアが行う必要のある処理はどれか。
  3. IOMMUの主な役割として正しいものはどれか。
  4. デバイスドライバの役割として正しいものはどれか。
  5. 一般的なOSで、アプリケーションが装置のレジスタを直接読み書きできないようにしている主な理由はどれか。