請教關於總線錯誤(Bus error) 和 定位處理問題.


在編制一和運行一個程序的時候, 人們可能會遇到下面的信息:"Bus error(core dumped);. 當出現這種信息的時候,則表示在SPARC等RISC類型的CPU中發生了"違反定位訪問"的情況.例如,讀者可以閱讀下面的程序.
#include <string.h>
#include <stdio.h>
void main()
{
char buf[256];
int *x;
x = (int *) & buf[1];
*x = 68000;
printf("*x = %d\n",*x);
}

在這段程序中,能夠確保256byte的存儲器區域,其中能夠存儲68000的整數值.但是,這樣也會發

生前面所講的地址問題.在上述的情況下,數組buf的存儲區域從4的整數倍開始.在該數組的第二個

位置(即奇數地址單元)中賦予了數據類型爲int的值.在RISC類型的CPU中,數據類型int值不能存儲

在4的整數倍地址中.因此,在將要對變量x賦值68000的時候,CPU不能夠繼續執行這個程序,則出現

Bus error這個信息,然後終止該程序的運行.

但是,在Pentinm(奔騰)系列的CPU中,則不會產生Bus error這個信息.這是因爲採用了Pentinm

系列的80386的流程的RISC類型的CPU,提高了CPU的處理效率,或電路進行了簡單化處理,從8位開始

就使用了重視移植性的體系結構.

在上述中,我看得不是很明白.請高人詳細地解說一下.
其中最不能理解的是:
1. "數組buf的存儲區域從4的整數倍開始" 爲什麼??
2. "在RISC類型的CPU中,數據類型int值不能存儲在4的整數倍地址中" 爲什麼??
3. "x = (int *) & buf[1];" , 這條語句我知道是進行強制轉換,可是char類型的&buf[1]不是

只有8bit嗎?它怎麼可以轉換成具有32bit的x呢?????
4. "x = (int *) & buf[1];" , 這條語句到底是怎麼實現的?或者說我該怎麼去理解它??
收起
lcy7618291 | 瀏覽 8304 次
推薦於2016-09-20 16:31:19 最佳答案
1  在SPARCRISC類型的CPU中,int型數據在內存中4字對齊,char buf[256]s雖然是char型,但爲256個(4的倍數),所以編譯器也使其4字對齊,及其內存開始地址必爲4的整數倍,例如0x1000;
2。 該句表述錯誤,實際應爲“在RISC類型的CPU中,數據類型int值只能存儲在4的整數倍地址中”
3 此處強制類型轉換的是指針而非char型變量,指針指向的內存只不過是一些數據,你可以認爲這些數據是任意類型,char、int 、float、double甚至結構
4 假設buf的開始地址爲0x1000,則這句將0x1001~0x1004的內容拷貝給x(x爲int型),如前所述,int型數據地址必須爲4的整數倍,此處0x1001不滿足該條件,故會引起CPU內部總線錯誤
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章