總線(xiàn)錯誤和段錯誤相關(guān)概念
bus
segmentation
總線(xiàn)錯誤
總線(xiàn)錯誤幾乎都是由于未對齊的讀或寫(xiě)造成的。它之所以稱(chēng)為總線(xiàn)錯誤,是因為出現未對齊的內存訪(fǎng)問(wèn)請求時(shí),被堵塞的組件就是地址總線(xiàn)。對齊的意思就是數據項只能存儲在地址是數據項大小的整數倍的內存位置上。在現代的計算機架構中,尤其是RISC架構,都需要數據對齊,因為與任意的對齊有關(guān)的額外邏輯會(huì )使整個(gè)內存系統更大且更慢。通過(guò)迫使每個(gè)內存訪(fǎng)問(wèn)局限在一個(gè)cache行或一個(gè)單獨的頁(yè)面內,可以極大地簡(jiǎn)化如cache控制器或內存管理單元這樣的硬件。
我們表達“數據項不能跨越頁(yè)面或cache邊界”規則的方法多少有些間接,因為我們用地址對齊這個(gè)術(shù)語(yǔ)來(lái)陳述這個(gè)問(wèn)題,而不是直截了當說(shuō)是禁止內存跨頁(yè)訪(fǎng)問(wèn),但它們說(shuō)的是同一回事。例如,訪(fǎng)問(wèn)一個(gè)8字節的double數據時(shí),地址只允許是8的整數倍。所以一個(gè)double數據可以存儲于地址24、8008、32768,但不能存儲于地址1006,頁(yè)和cache的大小是經(jīng)過(guò)精心設計的,這樣只要遵守對齊規則就可以保證一個(gè)原子數據項不會(huì )跨越一個(gè)頁(yè)或cache塊的邊界。
段錯誤
段錯誤通常是由于解除引用一個(gè)未初始化或非法值的指針引起的。以發(fā)生頻率為序,最終可能導致段錯誤的常見(jiàn)編程錯誤是:
1、壞指針錯誤:在指針賦值之前就用它來(lái)引用內存;或者向庫函數傳遞一個(gè)壞指針(如果調試器顯示系統程序中出現了段錯誤,很可能并不是系統程序引起的段錯誤,問(wèn)題可能就出現在自己的代碼中);或者指針被釋放后還繼續訪(fǎng)問(wèn)它的內容。
2、改寫(xiě)錯誤:越過(guò)數組邊界寫(xiě)入數據,在動(dòng)態(tài)分配的內存空間以外寫(xiě)入數據,或改寫(xiě)一些堆管理數據結構(在動(dòng)態(tài)分配的內存之前的區域寫(xiě)入數據就很容易發(fā)生這種情況)。
3、指針釋放引起的錯誤:釋放同一塊內存兩次,或釋放一塊未曾使用malloc分類(lèi)的內存,或釋放一個(gè)無(wú)效的指針。一個(gè)極為常見(jiàn)的與釋放內存有關(guān)的錯誤就是在
評論