簡體   English   中英

GDB無法訪問mmap()'d內核分配的內存?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM