計算機領域,總線錯誤bus error)是一種硬件故障英語Fault (computing),為通知操作系統一個進程正嘗試訪問CPU無法訪問的物理地址,即一個無效的位址匯流排地址,它由此得名。在現代的大多數架構中,這比記憶體區段錯誤(段錯誤)更罕見,而那主要由於內存訪問衝突所造成:即邏輯地址或權限的問題。

POSIX兼容平台上,總線錯誤通常導致發送SIGBUS信號到導致錯誤的進程。SIGBUS也可能因計算機檢測到的任何常規設備故障引發。總線錯誤很少代表硬件存在物理損壞,而通常是因程序源代碼中的程序錯誤引起。[來源請求]總線錯誤也可能因其他某些分頁錯誤引發,見下文。

原因

編輯

總線錯誤有至少三種主要原因:

不存在的地址

編輯

軟件令CPU讀寫特定的物理內存地址時,CPU會將這個物理內存地址填入地址總線,並等待所有其他連接着CPU的硬件來認領並響應這個請求。當沒有任何硬件響應CPU時,CPU會觸發一個異常,表示整個計算機系統都無法識別上述請求的物理內存地址。需要注意的是,這裡僅涉及到物理內存地址。如果訪問一個未定義的虛擬內存地址,一般會產生一個段錯誤而不是總線錯誤,儘管對於MMU與CPU分離的計算機來說,CPU無法區分這兩種情況。

未對齊的訪問

編輯

分頁錯誤

編輯

不存在段(x86)

編輯

x86上存在一種較舊的稱為x86記憶體區段的內存管理機制。

如果應用程序使用不存在段的選擇器加載段寄存器(在POSIX兼容的操作系統下只能使用匯編語言完成),則會生成異常。

參考資料

編輯