我正在研究进程内存管理。
我读了一篇关于流程地址空间布局的文章。
我引用了以下URL.
在linux中,start_data,end_data,start_brk,brk等是struct mm_struct的成员变量。
但是我想知道如何计算随机brk,堆栈,mmap偏移。
似乎这三个值(随机xxx偏移量)未在struct mm_struct中定义。
是否有任何函数或MACRO来计算这些值?
我正在使用Linux内核版本4.4和x86-64架构。
谢谢。
答案 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;
......
}
start_code,end_code代码段的开始和结束地址;
start_data,end_data数据部分的起始和结束地址;
start_brk,brk堆的起始和结束地址;
start_stack可以说是堆栈区域的开始;