2017-06-14 70 views
2

我試圖通過映射一個1 MiB文件,對應於RAM大小來建模一個基本的CPU。我想讀/寫這個文件。目前我收到一個SIGBUS錯誤ram[2] = 1,我收集的是試圖在文件範圍之外的mmap。我讀過,也許我需要用零填充文件作爲佔位符,但我有點困惑,爲什麼我必須這樣做,因爲我認爲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表示您正在寫入文件之外。從Linux手冊頁mmap(2)

SIGBUS

試圖訪問該不對應於該文件(例如,超出了文件的末尾的緩衝區的一部分, 包括的情況下另一個進程截斷了 文件)。

當你創建一個新的文件,它最初是,即有0字節大小。您需要使用ftruncate來調整它的大小,使其至少足以包含寫入的地址(可能向上舍入到頁面大小)。當你想有大小ram_bytes的RAM盤,則:

ftruncate(ramD, ram_bytes); 

See this answer for a longer explanation about the same mechanism, using POSIX shared memory objects


PS。 open返回int;您應該使用int而不是int16_t來存儲文件描述符。