gpt4 book ai didi

linux - 从 Linux 内核模块识别 glibc mmap 区域(VMA)

转载 作者:太空宇宙 更新时间:2023-11-04 04:21:25 25 4
gpt4 key购买 nike

我理解,当分配大于 MMAP_THRESHOLD 字节的内存块时,glibc malloc() 实现会使用 mmap 将内存分配为私有(private)匿名映射,并且此 mmap 分配区域不会作为 Linux vma 中的[heap]的一部分。

那么有没有什么方法可以识别 Linux 内核模块中的所有 glibc mmap 区域?

示例:

多次执行 malloc 大于 MMAP_THRESHOLD 的测试程序之一显示 cat/proc/pid/maps 输出为

00013000-00085000 rw-p 00000000 00:00 0          [heap]
40000000-40016000 r-xp 00000000 00:0c 14107305 /lib/arm-linux-gnueabi/ld-2.13.so
4025e000-4025f000 r--p 00001000 00:0c 14107276 /lib/arm-linux-gnueabi/libdl-2.13.so
4025f000-40260000 rw-p 00002000 00:0c 14107276 /lib/arm-linux-gnueabi/libdl-2.13.so
.....
.....
40260000-40261000 ---p 00000000 00:00 0
40261000-40a60000 rw-p 00000000 00:00 0
40a60000-40a61000 ---p 00000000 00:00 0
40a61000-42247000 rw-p 00000000 00:00 0
beed8000-beef9000 rw-p 00000000 00:00 0 [stack]

在这几个区域中(40a61000-42247000,40261000-40a60000)实际上是glibc mmap区域,那么从Linux内核模块有什么方法可以识别这些区域,类似于下面的代码来识别堆栈和堆?

if (vma->vm_start <= mm->start_brk &&
vma->vm_end >= mm->brk) {
name = "[heap]";
} else if (vma->vm_start <= mm->start_stack &&
vma->vm_end >= mm->start_stack) {
name = "[stack]";
}

最佳答案

我相信您不应该从内核模块转储应用程序的内存。您应该考虑使用 application checkpointing ,参见this answerBerkley checkpoint restart library

您还可以考虑使用内核内的core转储工具。

关于linux - 从 Linux 内核模块识别 glibc mmap 区域(VMA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12779174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com