C linux内存管理-如何获取;“随机xxx偏移量”;?

C linux内存管理-如何获取;“随机xxx偏移量”;?,c,memory-management,linux-kernel,C,Memory Management,Linux Kernel,我正在学习进程内存管理 我读了一篇关于进程地址空间布局的帖子。 我引用了以下内容 在linux中,start_data、end_data、start_brk、brk等是struct mm_struct的成员变量 但是我想知道如何计算随机brk、堆栈、mmap偏移。 这三个值(随机xxx偏移量)似乎没有在struct mm_struct中定义 是否有任何函数或宏来计算这些值 我使用的是linux内核版本4.4和x86-64体系结构 谢谢。操作系统已经实现了/proc//map,其中显示了该进程的

我正在学习进程内存管理

我读了一篇关于进程地址空间布局的帖子。

我引用了以下内容

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

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

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

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

我使用的是linux内核版本4.4和x86-64体系结构


谢谢。

操作系统已经实现了/proc//map,其中显示了该进程的所有vma,包括堆栈、堆,当然还有mmap-ed

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

而且,的确,“[heap]”是由上述src文件(kernel ver 3.10.24)中的代码片段标记的:

fs/proc/task_mmu.c:show_map_vma()

  • start\ U code,end\ U code代码段的起始地址和结束地址

  • start_data,end_data数据段的起始地址和结束地址

  • start_brk,brk堆的开始和结束地址

  • start_stack可预测的足够多,堆栈区域的开始


  • 您想知道流程的分段在哪里,或者如何计算随机数吗?创建流程后,它们将被修复。随机化只是为了让黑客更难破解,所以黑客不知道从堆栈或堆中读取内容的确切位置。@e0k谢谢你的好意评论。我想知道片段在哪里。例如,开始代码和结束代码之间存在代码段。数据段也存在于起始数据和结束数据之间。我想知道Bss部分的情况。Bss段从数据末尾开始。但是我不知道Bss段的结束位置。@newbie16 Bss没有存储在内核的任何特定变量中,但是为相应的位置分配了一个VMA。内核在伪文件
    /proc/self/maps
    中列出了当前进程的内存映射。它不是一个真正的文件;它不存在于磁盘或其他任何地方,而是在读取时由内核根据需要生成。如果将读取和打印添加到程序中,并反复运行它(或只运行
    cat/proc/self/maps
    ),则可以看到基本代码的地址保持不变,但库、堆栈和堆的映射确实不同。(此外,所示图像不适用于x86-64体系结构。)@NominalAnimal感谢您的评论。我想看看真正的内核代码如何计算Bss段地址。我寻找的代码片段似乎不存在于/fs/proc/self.c中。
    ... 
    if (vma->vm_start <= mm->brk && vma->vm_end >= mm->start_brk) 
    { 
        name = "[heap]"; goto done; } 
    ... 
    
    struct mm_struct{
    ......
        unsigned long start_code, end_code, start_data, end_data;
        unsigned long start_brk, brk, start_stack;
    ......
    }