GDB не может получить доступ к памяти, выделенной ядром для mmap ()? - PullRequest
4 голосов
/ 04 сентября 2010

У меня проблема с GDB и некоторыми буферами, выделенными в пространстве ядра.Буферы выделяются модулем ядра, который должен распределять непрерывные блоки памяти, а затем память отображается в пространство пользователя с помощью вызова mmap ().Однако GDB не может получить доступ к этим блокам в любое время.Например, после достижения точки останова в GDB:

(gdb) x /10xb 0x4567e000
0x4567e000:     Cannot access memory at address 0x4567e000

Тем не менее, глядя на отображаемые в данный момент области памяти приложения в / proc // smaps, вы увидите:

4567e000-456d3000 rwxs 8913f000 00:0d 883        /dev/cmem
Size:                340 kB
Rss:                 340 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Swap:                  0 kB

Причина I 'Я даже смотрю на это потому, что в какой-то момент во время выполнения этот адрес буфера (или другой, выделенный подобным образом) вызывает SIGSEGV.

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x49aea490 (LWP 652)]
0x402e4ea8 in fwrite () from /lib/libc.so.6
(gdb)
(gdb)
(gdb) where
#0  0x402e4ea8 in fwrite () from /lib/libc.so.6
#1  0x000eb394 in EncryptedWriter::Write (this=0x198600, buffRaw=0x4567e000 <Address     0x4567e000 out of bounds>, iLenRaw=719) at encrypted_writer.cpp:397
#2  0x0006b0f4 in EncryptionWrapper::Write (this=0x3ab2698, buffer=0x4567e000, size=719) at encryption.cpp:54

Эта ошибка возникает, несмотря на тот факт, что буфер интенсивно использовался вплоть до сбоя, а файл / proc // smaps по-прежнему отображает этот буфер, как указано выше.

Я совершенно не понимаю, почему это может происходить, и почему отображение кажется действительным в / proc, но никогда в GDB.

Ответы [ 2 ]

5 голосов
/ 04 сентября 2010

О том, почему GDB не может получить доступ к нужной вам памяти, я считаю, что Linux не делает доступной память ввода / вывода через ptrace () .

Согласно cmemk.c (который я нашел в linuxutils_2_25.tar.gz ), mmap () действительно устанавливает флаг VM_IO в рассматриваемой памяти.

Чтобы получить доступ к этой памяти из GDB, добавьте в вашу программу функцию, которая читает эту память, и пусть GDB вызывает эту функцию.

0 голосов
/ 13 декабря 2014

См. examing-mmaped-address-using-gdb обсуждение в другой ветке и особенно ответ здесь .Вы должны иметь возможность добавить пользовательский vm_operations_struct в VMA в реализации модуля mmap.

Также см. mm / memory.c в ядре Linux.При сбое get_user_pages() код попытается вызвать пользовательскую реализацию vma->vm_ops->access в вашем драйвере для доступа к памяти.

...