2017-06-14 11 views
2

私はRAMサイズに対応して1 MiBファイルをmmappingすることで、基本的なCPUをモデル化しようとしています。私はこのファイルを読み書きしたい。現在、私はram[2] = 1とSIGBUSエラーが発生しています。ファイルの範囲外でmmapしようとしています。私はおそらく、ファイルを0にしてプレースホルダとして埋める必要があると読んだのですが、私はこれをやる必要があるのか​​少し混乱しています。なぜなら、mmapは割り当てられるメモリチャンクを自動的に私が最初に触れたとき(私のテストで以下にしようとしているように)。私は何が欠けていますか?mmap SIGBUSエラーとファイルの初期化

int16_t ramD; 
if ((ramD = open("ramMap.txt", O_RDWR | O_CREAT, 0666)) == -1) 
{ 
    errx(EX_OSERR, "RAM could not be initialized"); 
} 

uint8_t* ram = mmap(0, ram_bytes, PROT_READ | PROT_WRITE, MAP_SHARED, ramD, 0); 

ram[2] = 1; 
printf("%i", ram[2]); 
+0

'ram_bytes'の値は何ですか? – myaut

+1

あなたは 'mmap'が成功したかどうかチェックしませんでした! –

+0

@DavidSchwartzマッピングが成功すると、sigbusが生成されます。 –

答えて

3

SIGBUSは、ファイルの外に書いていることを意味します。 mmap(2)、Linuxのmanページから:

場合など、例えば、ファイルの末尾を超えたファイル(、 に対応していないバッファの部分へのアクセスをしようと

SIGBUS

別のプロセスが ファイルを切り捨てました)。

新しいファイルを作成するとき、最初はの空きで、です。つまり、サイズは0バイトです。 ftruncateを使用してサイズを変更する必要があります。このサイズは、少なくともページサイズに切り上げられたアドレスを格納するのに十分な大きさにする必要があります。

ftruncate(ramD, ram_bytes); 

See this answer for a longer explanation about the same mechanism, using POSIX shared memory objects:あなたは、サイズram_bytesのRAMディスクを、持っていると思ったよう。


PS。 openintを返します。ファイルディスクリプタを格納するには、(int16_tではなく)を使用する必要があります。