新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 總線錯(cuò)誤和段錯(cuò)誤相關(guān)概念

總線錯(cuò)誤和段錯(cuò)誤相關(guān)概念

作者: 時(shí)間:2016-12-15 來源:網(wǎng)絡(luò) 收藏
在UNIX上編程時(shí),經(jīng)常會(huì)遇到如下兩個(gè)常見的運(yùn)行時(shí)錯(cuò)誤:

buserror總線錯(cuò)誤

本文引用地址:http://butianyuan.cn/article/201612/330343.htm

segmentationfault段錯(cuò)誤

總線錯(cuò)誤

總線錯(cuò)誤幾乎都是由于未對(duì)齊的讀或?qū)懺斐傻?。它之所以稱為總線錯(cuò)誤,是因?yàn)槌霈F(xiàn)未對(duì)齊的內(nèi)存訪問請(qǐng)求時(shí),被堵塞的組件就是地址總線。對(duì)齊的意思就是數(shù)據(jù)項(xiàng)只能存儲(chǔ)在地址是數(shù)據(jù)項(xiàng)大小的整數(shù)倍的內(nèi)存位置上。在現(xiàn)代的計(jì)算機(jī)架構(gòu)中,尤其是RISC架構(gòu),都需要數(shù)據(jù)對(duì)齊,因?yàn)榕c任意的對(duì)齊有關(guān)的額外邏輯會(huì)使整個(gè)內(nèi)存系統(tǒng)更大且更慢。通過迫使每個(gè)內(nèi)存訪問局限在一個(gè)cache行或一個(gè)單獨(dú)的頁(yè)面內(nèi),可以極大地簡(jiǎn)化如cache控制器或內(nèi)存管理單元這樣的硬件。

我們表達(dá)“數(shù)據(jù)項(xiàng)不能跨越頁(yè)面或cache邊界”規(guī)則的方法多少有些間接,因?yàn)槲覀冇玫刂穼?duì)齊這個(gè)術(shù)語(yǔ)來陳述這個(gè)問題,而不是直截了當(dāng)說是禁止內(nèi)存跨頁(yè)訪問,但它們說的是同一回事。例如,訪問一個(gè)8字節(jié)的double數(shù)據(jù)時(shí),地址只允許是8的整數(shù)倍。所以一個(gè)double數(shù)據(jù)可以存儲(chǔ)于地址24、8008、32768,但不能存儲(chǔ)于地址1006,頁(yè)和cache的大小是經(jīng)過精心設(shè)計(jì)的,這樣只要遵守對(duì)齊規(guī)則就可以保證一個(gè)原子數(shù)據(jù)項(xiàng)不會(huì)跨越一個(gè)頁(yè)或cache塊的邊界。

段錯(cuò)誤

段錯(cuò)誤通常是由于解除引用一個(gè)未初始化或非法值的指針引起的。以發(fā)生頻率為序,最終可能導(dǎo)致段錯(cuò)誤的常見編程錯(cuò)誤是:

1、壞指針錯(cuò)誤:在指針賦值之前就用它來引用內(nèi)存;或者向庫(kù)函數(shù)傳遞一個(gè)壞指針(如果調(diào)試器顯示系統(tǒng)程序中出現(xiàn)了段錯(cuò)誤,很可能并不是系統(tǒng)程序引起的段錯(cuò)誤,問題可能就出現(xiàn)在自己的代碼中);或者指針被釋放后還繼續(xù)訪問它的內(nèi)容。

2、改寫錯(cuò)誤:越過數(shù)組邊界寫入數(shù)據(jù),在動(dòng)態(tài)分配的內(nèi)存空間以外寫入數(shù)據(jù),或改寫一些堆管理數(shù)據(jù)結(jié)構(gòu)(在動(dòng)態(tài)分配的內(nèi)存之前的區(qū)域?qū)懭霐?shù)據(jù)就很容易發(fā)生這種情況)。

3、指針釋放引起的錯(cuò)誤:釋放同一塊內(nèi)存兩次,或釋放一塊未曾使用malloc分類的內(nèi)存,或釋放一個(gè)無效的指針。一個(gè)極為常見的與釋放內(nèi)存有關(guān)的錯(cuò)誤就是在for(p=start;p;p=p->next)這樣的循環(huán)中迭代一個(gè)鏈表,并在循環(huán)體內(nèi)使用free(p)這樣的語(yǔ)句。這樣,在下一次循環(huán)迭代時(shí),程序就會(huì)對(duì)已經(jīng)釋放的指針進(jìn)行解除引用操作,從而導(dǎo)致不可預(yù)料的結(jié)果。



關(guān)鍵詞: 總線錯(cuò)誤段錯(cuò)

評(píng)論


技術(shù)專區(qū)

關(guān)閉