總線錯誤與段錯誤


1) SIGBUS(Bus error)意味着指針所對應的地址是有效地址,但總線不能正常使用該指針。通常是未對齊的數據訪問所致。

2) SIGSEGV(Segment fault)意味着指針所對應的地址是無效地址,沒有物理內存對應該地址。

非法映射 vs 非法獲取、無定義(映射)

總線錯誤

  • 對一個錯誤的起始地址進行解引用
      由於進程的虛擬內存空間實際上是對物理地址的一個映射,操作系統和編譯器會用內存對齊來做優化,通常就是4字節對齊,所以int,float這種類型的起始地址都是4的倍數,而short的起始地址是2的倍數,double的起始地址是8的倍數,假如此時對一個不是4倍數的地址a進行解引用 (int *) a,就可能會出現總線錯誤,這個出現的情況還要具體看是哪一種操作系統。總線錯誤一般不會出現,出現的情況多半是使用了指針的強制轉換。

 

計算機領域,總線錯誤bus error)是一種硬件故障,為通知操作系統一個進程正嘗試訪問CPU無法訪問的物理地址,即一個無效的地址總線地址,它由此得名。

 

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

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

不存在的地址編輯

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

未對齊的訪問編輯

分頁錯誤

https://www.jianshu.com/p/50a945fc954b


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM