新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 總線錯誤和段錯誤相關概念

        總線錯誤和段錯誤相關概念

        作者: 時間:2016-12-15 來源:網絡 收藏
        在UNIX上編程時,經常會遇到如下兩個常見的運行時錯誤:

        buserror總線錯誤

        本文引用地址:http://www.104case.com/article/201612/330343.htm

        segmentationfault段錯誤

        總線錯誤

        總線錯誤幾乎都是由于未對齊的讀或寫造成的。它之所以稱為總線錯誤,是因為出現未對齊的內存訪問請求時,被堵塞的組件就是地址總線。對齊的意思就是數據項只能存儲在地址是數據項大小的整數倍的內存位置上。在現代的計算機架構中,尤其是RISC架構,都需要數據對齊,因為與任意的對齊有關的額外邏輯會使整個內存系統更大且更慢。通過迫使每個內存訪問局限在一個cache行或一個單獨的頁面內,可以極大地簡化如cache控制器或內存管理單元這樣的硬件。

        我們表達“數據項不能跨越頁面或cache邊界”規則的方法多少有些間接,因為我們用地址對齊這個術語來陳述這個問題,而不是直截了當說是禁止內存跨頁訪問,但它們說的是同一回事。例如,訪問一個8字節的double數據時,地址只允許是8的整數倍。所以一個double數據可以存儲于地址24、8008、32768,但不能存儲于地址1006,頁和cache的大小是經過精心設計的,這樣只要遵守對齊規則就可以保證一個原子數據項不會跨越一個頁或cache塊的邊界。

        段錯誤

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

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

        2、改寫錯誤:越過數組邊界寫入數據,在動態分配的內存空間以外寫入數據,或改寫一些堆管理數據結構(在動態分配的內存之前的區域寫入數據就很容易發生這種情況)。

        3、指針釋放引起的錯誤:釋放同一塊內存兩次,或釋放一塊未曾使用malloc分類的內存,或釋放一個無效的指針。一個極為常見的與釋放內存有關的錯誤就是在for(p=start;p;p=p->next)這樣的循環中迭代一個鏈表,并在循環體內使用free(p)這樣的語句。這樣,在下一次循環迭代時,程序就會對已經釋放的指針進行解除引用操作,從而導致不可預料的結果。



        關鍵詞: 總線錯誤段錯

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 偃师市| 康保县| 吉木萨尔县| 正安县| 喀什市| 千阳县| 城口县| 白城市| 嘉鱼县| 白水县| 交城县| 上思县| 黔南| 五大连池市| 抚顺市| 内乡县| 原阳县| 民县| 辽阳县| 宿迁市| 涿鹿县| 临汾市| 巴林左旗| 湖口县| 静乐县| 乃东县| 于都县| 大埔区| 太康县| 喀喇沁旗| 六枝特区| 佛山市| 镇沅| 高唐县| 两当县| 乳山市| 乌恰县| 东乡| 鹿泉市| 巫山县| 德格县|