我使用的是在intel i7處理器上編譯的Opensuse 13.1上的程序。我在qemu(虛擬)環境中編譯了相同的程序,以模擬帶有ARM處理器的OpenSuse 13.1。這行代碼:mmap intel(i7)和arm上的不同行爲?
rvp = mmap(rvp, length, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fildes, 0);
給我一個指向Ram內存的指針。但是這個內存的大小在intel和arm之間是不一樣的:在intel上,這個內存的大小是「長度」,與fildes所指向的文件的大小無關,不同的是intel和arm之間的內存大小不同:
。
在ARM上,大小(大約)是由fildes指向的文件的大小,並且忽略了大小大於fildes的事實。
我想擁有的不僅僅是文件分配更多的內存...
編輯:我試圖解決這個問題有兩個連續調用......沒有成功:
rvp = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
unsigned int i;
for (i = 0; i < length; i += 5000)
printf("acces buffer at %i --> %u\n", i, rvp[i]);
rvp = mmap(rvp, length, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fildes, 0);
for (i = 0; i < length; i += 5000)
printf("acces buffer at %i --> %u\n", i, rvp[i]);
爲輸出I得到:
access buffer at 0 --> 0
...
access buffer at 90000 -> 0
access buffer at 0 --> 0
...
access buffer at 85000 --> 0
Segmentation fault...
正如我在我的問題的編輯(1小時前)注意;我試過你的第二個建議:兩個連續的mmap調用......但第二個再次將可訪問內存截斷爲我正在閱讀的文件的大小... –
感謝您的幫助,但我已經得到了我想要的替代方案方法: rvp = malloc(length); \t unsigned int nread = read(fildes,rvp,length); –
@ChrisMaes是的,發生這種情況是因爲在兩次調用mmap時使用了相同的「length」值。如果你在第二次調用中指定了文件*的大小(由'fstat'返回)作爲映射長度,它就會起作用。 – zwol