在編制一和運行一個程序的時候, 人們可能會遇到下面的信息:"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];" , 這條語句到底是怎麼實現的?或者說我該怎麼去理解它?
1 在SPARC等RISC類型的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內部總線錯誤