【linux】内存管理

  • 内存管理单元(MMU),通过分段分页的机制,提供虚拟地址到物理地址的映射方法。
  • linux内核态进程之间共享地址空间,如果进行管理?
  • linux用户态进程之间地址空间是隔离的,如果进行管理?
  1. 读Linux内核以及相关的资料的时候,时刻要清醒地认识到它说的是内核态还是用户态的东西。
  2. 一个用户态进程/线程在内核中都是用一个task_struct的实例描述的,这个有点类似设计模式里面的桥接模式(handle-body), 用户态看到的进程PID,线程TID都是handle, task_struct是body。
  3. C语言书里面讲的堆、栈大部分都是用户态的概念,用户态的堆、栈对应用户进程虚拟地址空间里的一个区域,栈向下增长,堆用malloc分配,向上增长。
  4. 用户空间的堆栈,在task_struct->mm->vm_area里面描述,都是属于进程虚拟地址空间的一个区域。
  5. 而内核态的栈在tsak_struct->stack里面描述,其底部是thread_info对象,thread_info可以用来快速获取task_struct对象。整个stack区域一般只有一个内存页(可配置),32位机器也就是4KB。
  6. 所以说,一个进程的内核栈,也是进程私有的,只是在task_struct->stack里面获取。
  7. 内核态没有进程堆的概念,用kmalloc()分配内存,实际上是Linux内核统一管理的,一般用slab分配器,也就是一个内存缓存池,管理所有可以kmalloc()分配的内存。所以从原理上看,在Linux内核态,kmalloc分配的所有的内存,都是可以被所有运行在Linux内核态的task访问到的。

作者:向晨
链接:https://www.zhihu.com/question/57013926/answer/151306072
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。