内存管理

虚拟内存空间管理

用户态虚拟内存结构

如下图虚拟空间布局
内存管理_第1张图片

  • 栈的增长方向为由高地址到低地址,所以可以看到代码中进入函数以后要为局部变量分配栈空间使用的是汇编指令sub rsp
  • text,data,bss段其实跟elf文件中的内容一致,即操作系统在加载可执行程序时,将其三个区域加载到内存中
  • 32位和64位下用户态使用的虚拟地址范围和内核态使用的虚拟地址范围划分不同,一旦陷入内核态后,虚拟地址的访问走的就是内核的页表,不存在不同进程间的差别;
  • 如果在内核态访问用户态范围的虚拟地址,则走的是当前正在调度的进程的页表。所以说比如在ioctl时候在内核态访问当前进程的用户态传下来的的地址没啥问题,一旦把这个地址保留下来在其他时机访问那就很有可能GG了

    /proc/maps

    可以通过/proc/{pid}/maps来查看进程的虚拟地址空间布局情况
    内存管理_第2张图片

  • 布局情况与结构图基本一致,maps中的每一行则表示了一个struct vm_area结构对象
  • 子线程的[heap]和[stack]等不会被标识出来,会在映射区进行额外的分配映射

    物理内存管理

    内存映射

    映射方式

你可能感兴趣的