按照不同的访问属性和功能划分为不同的内存区域,VMA
代码段:可执行文件的内存映射
数据段:可执行文件的已初始化全局变量和静态局部变量的内存映射
bss段:未初始化的或者值为0的变量的内存映射
lib库的代码段:多个
lib库的数据段:多个
lib库的bss段:多个
任何内存映射文件(有名mmap建立)
任何共享内存段(匿名mmap建立)
进程栈stack
进程堆heap
内核每进程的vm_area_struct项 | /proc/pid/maps | 含义 |
---|---|---|
vm_start | 第一列 如00377000 | 此段虚拟地址空间的起始地址 |
vm_end | 后一列 如00390000 | 此段虚拟地址空间的空间结束地址 |
vm_flags | 第三列 如r-xp | 此段虚拟地址空间的属性 r可读 w可写 x可执行p私有段 s共享段 |
vm_pgoff | 第四列 如0000000 | 对有名映射。表示此段虚拟内存起始地址在文件中以页为单位进行偏移,对匿名映射它等于0或者vm_start/PAGE_SIZE |
vm_file->s_dev | 第五列 如fd:00 | 映射文件所属设备号,对匿名映射来说,因为没有在文件的磁盘上,所以没有设备号,始终为00:00,对有名映射来说,是映射文件所在设备的设备号 |
vm_file->i_ino | 第六列 如9176473 | 节点号 |
第七列 如lib/ld-2.5.so | 对有名来说,是映射的文件名,对匿名映射来说是此段虚拟内存在进程中的角色 stack表示在进程中做如ib/ld-2.5.so heap表示堆 其余情况不显示 |
数据结构
内核使用mm_struct来描述一个进程的虚拟地址空间,用vm_area_struct来描述一个虚拟内存区域(VMA)进程的虚拟地址空间由多个VMA组成