【问题标题】:used heap size of user process from kernel module内核模块中用户进程使用的堆大小
【发布时间】:2012-05-15 03:34:23
【问题描述】:

我正在编写一个内核模块,它将接受用户进程 ID (PID) 作为输入并转储该用户进程的所有地址空间,如堆​​栈、堆段。

我将mm->start_brk 作为堆的开始,mm->brk 作为堆的结束,然后我看到,即使用户进程没有使用 33 页,堆大小显示为 33 页 (mm->brk - mm->start_brk)。 (我使用/proc/pid/maps 验证了这一点)。 Stack 的行为也类似。

那么有什么办法可以找出从mm->start_brk开始的真正使用的堆,这样我就可以只转储使用的堆。

【问题讨论】:

    标签: linux memory-management linux-kernel


    【解决方案1】:

    进程可以使用brkmmap 分配内存。后者不改变堆,而是单独分配。

    mm->mmap 是由mmap 创建的映射的链接列表。

    【讨论】:

    • 谢谢 ugoren,但问题是,我正在使用我的内核模块转储用户进程的堆内存。我用于测试的用户进程仅执行几个字节的 malloc。但来自内核模块我可以看到内核第一次提供大约 32 页(33*4K)的堆内存(cat /proc/pid/maps 也将解释这一点)。我的测试用户进程只使用了几个字节,其他的都是零.所以我只想找到堆的确切使用区域。不是 mm->brk - mm->start_brk
    • 内核不知道进程管理堆的方式。如果它向内核请求 32 个页面,那么就内核而言,它有 32 个页面。您可以检查哪些映射到物理内存 - 从未接触过的页面不会被映射。
    • 我的测试程序就像下面做 10 字节的 malloc,当我做这个程序的 cat /proc//maps 时,我看到它的堆大小为 33 页。所以这意味着当exec brk 会调用默认的 33 页吗? --------------------------------------------包括 int main() { 字符 *ptr; while(1) { ptr = malloc(10);免费(ptr); } } cat /proc/pid/maps 082f4000-08315000 rw-p 00000000 00:00 0 [堆]
    • 由 libC 和内核决定如何处理malloc。 libC 可能会提前要求 32 页,所以下一个mallocs 会更便宜。
    • 是的,您是绝对正确的,来自 mmap 的手册页,“MMAP_THRESHOLD 默认为 128 kB(32*4KB 页面),但可以使用 mallopt(3) 进行调整”,所以我们可以这样得出结论内核方面我们无法知道进程真正使用了多少堆?
    猜你喜欢
    • 1970-01-01
    • 2010-10-21
    • 2010-09-16
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    相关资源
    最近更新 更多