作業系統與硬體

如上方所示,以記憶體映射I/O(memory-mapped I/O)讀取裝置的狀態暫存器時,加上volatile並將該區域設為不快取,其理由為下列何者?

#define STATUS (*(volatile unsigned int *)0x40001000)
while ((STATUS & 1) == 0)
    ;   /* 等待到裝置準備完成為止 */
  1. A因為加上volatile後,讀取指令會被合併成只有一次,速度會變快
  2. B因為放入快取後,裝置暫存器的值會自動回到0
  3. C因為數值是由裝置改變的,若不每次實際重新讀取,就會漏掉變化
查看答案與解析

正確答案:C. 因為數值是由裝置改變的,若不每次實際重新讀取,就會漏掉變化

裝置暫存器的值是由裝置獨立於程式之外改寫的。若沒有volatile,編譯器會判斷迴圈中的值不會改變而只讀取一次,產生永遠等待下去的程式碼。此外,若將該區域快取,CPU會一直讀取快取中的舊值,看不到裝置的變化。volatile是用來禁止省略讀取的指定,作用與合併成一次正好相反。放入快取也不會使值變成0。

  • A. volatile是禁止省略讀取的,與合併成一次相反。
  • B. 即使快取,數值也不會回到0。
  • C. 正確。數值由裝置改變,所以每次都必須實際讀取。
練習這個領域 前往領域頁面

作業系統與硬體的其他題目

  1. CPU不使用中斷而是反覆檢查裝置狀態的方式(輪詢,polling),在下列哪種情況較有利?
  2. 在硬體不維持快取一致性(非一致性,non-coherent)的系統中,於CPU讀取裝置以DMA寫入主記憶體的資料之前,軟體必須進行下列何種處理?
  3. 關於IOMMU的主要作用,下列何者正確?
  4. 關於裝置驅動程式(device driver)的作用,下列何者正確?
  5. 一般的作業系統不讓應用程式直接讀寫裝置暫存器,其主要理由為何?

這個領域的比較