mm_struct中控制内存区域位置的成员

mm_struct中控制内存区域位置的成员

Content #

用户态虚拟空间里面有几类数据,例如代码、全局变量、堆、栈、内存映射区等。在 struct mm_struct 里面,有下面这些变量定义了这些区域的统计信息和位置。

unsigned long mmap_base;  /* base of mmap area */
unsigned long total_vm;    /* Total pages mapped */
unsigned long locked_vm;  /* Pages that have PG_mlocked set */
unsigned long pinned_vm;  /* Refcount permanently increased */
unsigned long data_vm;    /* VM_WRITE & ~VM_SHARED & ~VM_STACK */
unsigned long exec_vm;    /* VM_EXEC & ~VM_WRITE & ~VM_STACK */
unsigned long stack_vm;    /* VM_STACK */
unsigned long start_code, end_code, start_data, end_data;
unsigned long start_brk, brk, start_stack;
unsigned long arg_start, arg_end, env_start, env_end;

total_vm #

总共映射的页的数目。这么大的虚拟地址空间,不可能都有真实内存对应,所以这里是映射的数目。当内存吃紧的时候,有些页可以换出到硬盘上,有的页因为比较重要,不能换出。

locked_vm和pinned_vm #

locked_vm 就是被锁定不能换出,pinned_vm 是不能换出,也不能移动。

data_vm, exec_vm, stack_vm #

data_vm 是存放数据的页的数目,exec_vm 是存放可执行文件的页的数目, stack_vm 是栈所占的页的数目。

start_code 和 end_code #

表示可执行代码的开始和结束位置

start_data 和 end_data #

表示已初始化数据的开始位置和结束位置。

start_brk, brk #

start_brk 是堆的起始位置,brk 是堆当前的结束位置。用malloc 申请一小块内存的话,就是通过改变 brk 位置实现的。

stack_stack #

start_stack 是栈的起始位置,栈的结束位置在寄存器的栈顶指针中。

arg_start, arg_end, env_start, env_end #

arg_start 和 arg_end 是参数列表的位置, env_start 和 env_end 是环境变量的位置。它们都位于栈中最高地址的地方。

mmap_base #

mmap_base 表示虚拟地址空间中用于内存映射的起始地址。一般情况下,这个空间是从高地址到低地址增长的。malloc 申请一大块内存的时候,就是通过 mmap 在这里映射一块区域到物理内存。咱们加载动态链接库 so 文件,也是在这个区域里面,映射一块区域到 so 文件。

整个布局就像下面这张图这样。

Viewpoints #

From #

22 | 进程空间管理:项目组还可以自行布置会议室