Несуществующая ошибка физического адреса с mmap - PullRequest
3 голосов
/ 14 октября 2011

Я пытаюсь отобразить файл, и, похоже, это удается, но когда я получаю к нему доступ, я получаю ошибку SIGBUS.Код:

int main(int argc, char* argv[]) {
int pid = getpid();
char cmd [1024];
int file;
if (argc != 2) {
    printf("Wrong arguments\n");
    return 1;
}
printf("%s", argv[1]);
int numpages = atoi(argv[1]);
sprintf(cmd, "cat /proc/%d/maps", pid);
system(cmd);
long page_size = sysconf(_SC_PAGESIZE);
file = open(argv[1], O_RDWR, (mode_t)0600);
ftruncate(file, page_size  * numpages);
if(file == -1) {
    perror("file open failed!\n");
    return 1;
}
printf("\n\n mapping file - numpages: %d \n\n", numpages);
printf("mapping %ld KB\n", page_size  * numpages/1024);
int* mapped_file = mmap(0, page_size  * numpages,  PROT_READ | PROT_WRITE, MAP_PRIVATE, file, 0 );
if (mapped_file == MAP_FAILED) {
    perror("Map failed");
    return 1;
}
printf("mapped file at %p\n\n", mapped_file);
int* current_pos = mapped_file;

system(cmd);

int j;
for (j=0; j<numpages; j++) {
    printf("%d   ", *current_pos);
    current_pos += page_size/4;
}
if (munmap (mapped_file, page_size  * numpages) == -1) {
        perror ("munmap");
        return 1;
}
if (close(file) == -1) {
    perror("close");
    return 1;
}
return 0;
}

Вывод:

<code>
(gdb) run 64
Starting program: /home/jords/engcode/workspace/SE370Assignment3/A3Program3 64
00400000-00401000 r-xp 00000000 08:03 3288976                            /home/jords/engcode/workspace/SE370Assignment3/A3Program3
00600000-00601000 r--p 00000000 08:03 3288976                            /home/jords/engcode/workspace/SE370Assignment3/A3Program3
00601000-00602000 rw-p 00001000 08:03 3288976                            /home/jords/engcode/workspace/SE370Assignment3/A3Program3
7ffff7a48000-7ffff7bd2000 r-xp 00000000 00:10 8103                       /lib/x86_64-linux-gnu/libc-2.13.so
7ffff7bd2000-7ffff7dd1000 ---p 0018a000 00:10 8103                       /lib/x86_64-linux-gnu/libc-2.13.so
7ffff7dd1000-7ffff7dd5000 r--p 00189000 00:10 8103                       /lib/x86_64-linux-gnu/libc-2.13.so
7ffff7dd5000-7ffff7dd6000 rw-p 0018d000 00:10 8103                       /lib/x86_64-linux-gnu/libc-2.13.so
7ffff7dd6000-7ffff7ddc000 rw-p 00000000 00:00 0 
7ffff7ddc000-7ffff7dfd000 r-xp 00000000 00:10 8090                       /lib/x86_64-linux-gnu/ld-2.13.so
7ffff7fd0000-7ffff7fd3000 rw-p 00000000 00:00 0 
7ffff7ff8000-7ffff7ffb000 rw-p 00000000 00:00 0 
7ffff7ffb000-7ffff7ffc000 r-xp 00000000 00:00 0                          [vdso]
7ffff7ffc000-7ffff7ffd000 r--p 00020000 00:10 8090                       /lib/x86_64-linux-gnu/ld-2.13.so
7ffff7ffd000-7ffff7fff000 rw-p 00021000 00:10 8090                       /lib/x86_64-linux-gnu/ld-2.13.so
7ffffffde000-7ffffffff000 rw-p 00000000 00:00 0                          [stack]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
64</p>

<p>mapping file - numpages: 64 </p>

<p>mapping 256 KB
mapped file at 0x7ffff7ff4000</p>

<p>00400000-00401000 r-xp 00000000 08:03 3288976                            /home/jords/engcode/workspace/SE370Assignment3/A3Program3
00600000-00601000 r--p 00000000 08:03 3288976                            /home/jords/engcode/workspace/SE370Assignment3/A3Program3
00601000-00602000 rw-p 00001000 08:03 3288976                            /home/jords/engcode/workspace/SE370Assignment3/A3Program3
7ffff7a48000-7ffff7bd2000 r-xp 00000000 00:10 8103                       /lib/x86_64-linux-gnu/libc-2.13.so
7ffff7bd2000-7ffff7dd1000 ---p 0018a000 00:10 8103                       /lib/x86_64-linux-gnu/libc-2.13.so
7ffff7dd1000-7ffff7dd5000 r--p 00189000 00:10 8103                       /lib/x86_64-linux-gnu/libc-2.13.so
7ffff7dd5000-7ffff7dd6000 rw-p 0018d000 00:10 8103                       /lib/x86_64-linux-gnu/libc-2.13.so
7ffff7dd6000-7ffff7ddc000 rw-p 00000000 00:00 0 
7ffff7ddc000-7ffff7dfd000 r-xp 00000000 00:10 8090                       /lib/x86_64-linux-gnu/ld-2.13.so
7ffff7fd0000-7ffff7fd3000 rw-p 00000000 00:00 0 
7ffff7ff4000-7ffff7ff8000 rw-p 00000000 08:03 3288973                    /home/jords/engcode/workspace/SE370Assignment3/64
7ffff7ff8000-7ffff7ffb000 rw-p 00000000 00:00 0 
7ffff7ffb000-7ffff7ffc000 r-xp 00000000 00:00 0                          [vdso]
7ffff7ffc000-7ffff7ffd000 r--p 00020000 00:10 8090                       /lib/x86_64-linux-gnu/ld-2.13.so
7ffff7ffd000-7ffff7fff000 rw-p 00021000 00:10 8090                       /lib/x86_64-linux-gnu/ld-2.13.so
7ffffffde000-7ffffffff000 rw-p 00000000 00:00 0                          [stack]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]</p>

<p>Program received signal SIGBUS, Bus error.
0x0000000000400abb in main (argc=2, argv=0x7fffffffe058) at A3Program3.c:49
49      printf("%d", mapped_file[0]);
(gdb) </p>

<p>
Меня смущает, так как на выходных данных карт ясно видно, что файл был отображен, а адрес правильный - но выдает ошибку всякий раз, когдаЯ пытаюсь получить к нему доступ.

РЕДАКТИРОВАТЬ: Valgrind:



ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
==16295== 
==16295== Process terminating with default action of signal 7 (SIGBUS)
==16295==  Non-existent physical address at address 0x4024000
==16295==    at 0x400AB7: main (A3Program3.c:49)
==16295== 

Обновление: поэтому я остановил его сбой (спасибо :)) с помощью вызова ftruncate, но он печатает все нули:<pre> jords@jords-desktop ~/engcode/workspace/SE370Assignment3 (master) $ ./A3Program3 64 00400000-00401000 r-xp 00000000 08:03 3288976 /home/jords/engcode/workspace/SE370Assignment3/A3Program3 00600000-00601000 r--p 00000000 08:03 3288976 /home/jords/engcode/workspace/SE370Assignment3/A3Program3 00601000-00602000 rw-p 00001000 08:03 3288976 /home/jords/engcode/workspace/SE370Assignment3/A3Program3 7f96ec7a1000-7f96ec92b000 r-xp 00000000 00:10 8103 /lib/x86_64-linux-gnu/libc-2.13.so 7f96ec92b000-7f96ecb2a000 ---p 0018a000 00:10 8103 /lib/x86_64-linux-gnu/libc-2.13.so 7f96ecb2a000-7f96ecb2e000 r--p 00189000 00:10 8103 /lib/x86_64-linux-gnu/libc-2.13.so 7f96ecb2e000-7f96ecb2f000 rw-p 0018d000 00:10 8103 /lib/x86_64-linux-gnu/libc-2.13.so 7f96ecb2f000-7f96ecb35000 rw-p 00000000 00:00 0 7f96ecb35000-7f96ecb56000 r-xp 00000000 00:10 8090 /lib/x86_64-linux-gnu/ld-2.13.so 7f96ecd2a000-7f96ecd2d000 rw-p 00000000 00:00 0 7f96ecd52000-7f96ecd55000 rw-p 00000000 00:00 0 7f96ecd55000-7f96ecd56000 r--p 00020000 00:10 8090 /lib/x86_64-linux-gnu/ld-2.13.so 7f96ecd56000-7f96ecd58000 rw-p 00021000 00:10 8090 /lib/x86_64-linux-gnu/ld-2.13.so 7fff9be10000-7fff9be31000 rw-p 00000000 00:00 0 [stack] 7fff9bf0b000-7fff9bf0c000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] 64</p> <p>mapping file - numpages: 64 </p> <p>mapping 256 KB mapped file at 0x7f96eccea000</p> <p>00400000-00401000 r-xp 00000000 08:03 3288976 /home/jords/engcode/workspace/SE370Assignment3/A3Program3 00600000-00601000 r--p 00000000 08:03 3288976 /home/jords/engcode/workspace/SE370Assignment3/A3Program3 00601000-00602000 rw-p 00001000 08:03 3288976 /home/jords/engcode/workspace/SE370Assignment3/A3Program3 7f96ec7a1000-7f96ec92b000 r-xp 00000000 00:10 8103 /lib/x86_64-linux-gnu/libc-2.13.so 7f96ec92b000-7f96ecb2a000 ---p 0018a000 00:10 8103 /lib/x86_64-linux-gnu/libc-2.13.so 7f96ecb2a000-7f96ecb2e000 r--p 00189000 00:10 8103 /lib/x86_64-linux-gnu/libc-2.13.so 7f96ecb2e000-7f96ecb2f000 rw-p 0018d000 00:10 8103 /lib/x86_64-linux-gnu/libc-2.13.so 7f96ecb2f000-7f96ecb35000 rw-p 00000000 00:00 0 7f96ecb35000-7f96ecb56000 r-xp 00000000 00:10 8090 /lib/x86_64-linux-gnu/ld-2.13.so 7f96eccea000-7f96ecd2a000 rw-p 00000000 08:03 3288973 /home/jords/engcode/workspace/SE370Assignment3/64 7f96ecd2a000-7f96ecd2d000 rw-p 00000000 00:00 0 7f96ecd52000-7f96ecd55000 rw-p 00000000 00:00 0 7f96ecd55000-7f96ecd56000 r--p 00020000 00:10 8090 /lib/x86_64-linux-gnu/ld-2.13.so 7f96ecd56000-7f96ecd58000 rw-p 00021000 00:10 8090 /lib/x86_64-linux-gnu/ld-2.13.so 7fff9be10000-7fff9be31000 rw-p 00000000 00:00 0 [stack] 7fff9bf0b000-7fff9bf0c000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Я думаю, это потому, что файл не читается правильно, поэтому все, что я читаю, это дополненные нули.Но я не уверен, почему это будет

Обновление, сработало, оно действительно читало файл правильно, я просто делал ошибку с точки зрения того, как его прочитать.Спасибо всем

Ответы [ 2 ]

5 голосов
/ 14 октября 2011

Проблема в том, что вы открываете файл с помощью O_TRUNC, который усекает его, и, поскольку mmap может отображать только существующее содержимое файла, он даст вам сигнал.Используйте truncate() (и друзей), чтобы обрезать файл до правильного размера перед отображением.

На справочной странице mmap:

   SIGBUS Attempted access to a portion of the buffer that does not correspond to the file (for example, beyond the end of the file, including the case where another process has truncated the file).
2 голосов
/ 14 октября 2011

Есть ошибка, но она не объясняет сбой в mapped_file[0].

sysconf(_SC_PAGESIZE) дает вам размер страницы в байтах .

Вна каждой итерации current_pos += page_size вы увеличиваете указатель на sysconf(_SC_PAGESIZE)*sizeof(int), поэтому вы быстро выходите за пределы отображаемой области.

Кроме того, page_size * 4 в mmap выглядит сомнительно: конечно, num_pages должноприйти в уравнение?

...