バスエラー(Bus error)と位置決め処理の問題について教えてください.


プログラムを作成して実行するとき、「Bus error(core dumped);.このような情報が発生した場合、SPARCなどのRISCタイプのCPUで「位置決め違反アクセス」が発生したことを示す.例えば、読者は次のプログラムを読むことができる.#include#include void main(){char buf[256];int*x;x=(int*)&buf[1];*x=68000;printf("*x=%d",*x);}このプログラムでは、256 byteのメモリ領域を確保することができ、68000の整数値を記憶することができる.しかし、前述のアドレスの問題も発生する.上記の場合、配列bufの記憶領域は4の整数倍から始まる.この配列の2番目の位置(すなわち奇数アドレスユニット)には、データ型intの値が付与.RISCタイプのCPUでは、データ型intの値を4の整数倍アドレスに記憶することができない.したがって、変数xに68000を付与際にCPUがこのプログラムを実行することができない場合には、Bus errorという情報が出て、そのプログラムの実行を終了する.しかし、Pentinm(Pentium)シリーズの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]は8 bitしかないのではないでしょうか.32 bitのxに変換するにはどうすればいいのでしょうか???4. "x = (int *) & buf[1];", この文はいったいどうやって実現したのですか.それともどうやって理解すればいいの??ひきあげる
lcy7618291 
|
閲覧数8304回
2016-09-20 16:31:19におすすめ
#砂漠探検-問題に答えて礼を連発する
ベストアンサー
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