[英]GDB can't access mmap()'d kernel allocated memory?
我遇到了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
我甚至考慮這個的原因是因為在運行期間的某個時刻,這個緩沖區地址(或以類似方式分配的另一個)會導致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中有效。
關於為什么gdb無法訪問你想要的內存,我相信Linux不會通過ptrace()訪問I / O內存。
根據cmemk.c(我在linuxutils_2_25.tar.gz中找到),mmap()確實在相關內存上設置了VM_IO標志。
要從gdb訪問此內存,請在程序中添加一個讀取此內存並讓gdb調用此函數的函數。
請參閱另一個線程中的examine-mmaped-addresses-using-gdb討論,特別是這里的答案。 您應該能夠在模塊的mmap實現中向您的VMA添加自定義vm_operations_struct
。
另請參閱Linux內核中的mm / memory.c 。 當get_user_pages()
失敗時,代碼將嘗試在驅動程序中調用自定義vma->vm_ops->access
實現來訪問內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.