linux内存管理 - 如何获得“随机xxx偏移”?

时间:2016-12-10 15:38:09

标签: c memory-management linux-kernel

我正在研究进程内存管理。

我读了一篇关于流程地址空间布局的文章。

我引用了以下URL.

processMemlayout

在linux中,start_data,end_data,start_brk,brk等是struct mm_struct的成员变量。

但是我想知道如何计算随机brk,堆栈,mmap偏移。

似乎这三个值(随机xxx偏移量)未在struct mm_struct中定义。

是否有任何函数或MACRO来计算这些值?

我正在使用Linux内核版本4.4和x86-64架构。

谢谢。

1 个答案:

答案 0 :(得分:1)

操作系统已实现/ proc /< pid> / maps显示该进程的所有VMA,包括堆栈,堆,当然还有mmap-ed。

如果要检查所有这些信息的填充位置,可以查看内核源代码,相关代码(查找给定PID的VMA)似乎在这里: fs / proc / task_mmu.c

而且,确实,“[heap]”由上面的src文件(内核版本3.10.24)中的代码片段标记:

<强> FS / PROC / task_mmu.c:show_map_vma()

... 
if (vma->vm_start <= mm->brk && vma->vm_end >= mm->start_brk) 
{ 
    name = "[heap]"; goto done; } 
... 

还有一件事,如果你想检查特定段的起始端地址,请检查mm_struct是否已定义。你会得到以下的东西: -

struct mm_struct{
......
    unsigned long start_code, end_code, start_data, end_data;
    unsigned long start_brk, brk, start_stack;
......
}
  1. start_code,end_code代码段的开始和结束地址;

  2. start_data,end_data数据部分的起始和结束地址;

  3. start_brk,brk堆的起始和结束地址;

  4. start_stack可以说是堆栈区域的开始;