我在学习过程记忆管理。
我读了一篇关于进程地址空间布局的文章。
我引用了以下URL.
在linux中,start_data、end_data、start_brk、brk等是struct mm_struct的成员变量。
但是我想知道如何计算随机刹车,堆栈,mmap偏移。
这三个值(Random xxx offset)似乎没有在struct mm_struct中定义。
有计算这些值的函数或宏吗?
我使用的是linux内核版本4.4和x86-64体系结构。
谢谢您。
最佳答案
操作系统已经实现了/proc//maps,它显示了该进程的所有vma,包括堆栈、堆,当然还有mmap ed。
如果您想检查所有这些信息的填充位置,那么可以检查内核源代码,相关代码(查找给定PID的vma)似乎在这里:fs/proc/task_mmu.c。
是的,确实,“[堆]”由上述src文件(kernel ver 3.10.24)中的代码片段标记:
fs/proc/task_mmu.c:显示映射_vma()
...
if (vma->vm_start <= mm->brk && vma->vm_end >= mm->start_brk)
{
name = "[heap]"; goto done; }
...
还有一件事,如果您想检查特定段的起始-结束地址,请检查中定义的mm结构你会得到以下东西:-
struct mm_struct{
......
unsigned long start_code, end_code, start_data, end_data;
unsigned long start_brk, brk, start_stack;
......
}
起始代码,结束代码代码段的起始和结束地址;
开始数据,结束数据数据段的开始和结束地址;
start_brk,brk堆的开始和结束地址;
足够可预测地开始堆栈,堆栈区域的开始;