EricJeffrey的个人博客

内核内存管理模块入门与介绍

大致介绍下内存管理的一些大框架,帮助新人快速入门。

前置知识(非严谨描述)

虚拟地址与物理地址(虚拟内存/物理内存)

用户态看到的地址如char *addr=malloc(16);中的addr是虚拟地址(进程可用地址范围内中一个数值),它实际对应到内存条中的物理地址可能是某个paddr(physical address)(由内核决定,用户态一般无法控制)。

内核通过多级页表的方式实现虚拟地址到物理地址的映射关系addr->paddr,并将这个多级页表配置到CPU中。对于CPU来说,它执行指令时拿到的值也是虚拟地址。它会通过内核创建的多级页表,将addr翻译为物理地址paddr,然后从内存条中读取实际的值。

pagefault

addr->paddr的映射关系是可以动态创建的,典型方式是mmap之后通过pagefault去创建。

如果CPU在读取虚拟地址addr的时候,发现内核配置的页表上找不到有效的paddr,就会触发一次访存失败(data/instruction abort),然后进入内核中执行pagefault的处理流程。

pagefault处理流程负责分配物理页(内核是按照页的粒度管理内存,不是byte),并创建相应的映射关系。之后就可以让CPU继续执行对应访存指令访问对应地址的内容了。

因此对于进程来说,内存分配可以分为虚拟内存创建映射建立两部分

系统调用

系统调用是内核提供的直接入口,根据他们能大致了解内存管理的目标 -> 即向上层应用提供分配内存、释放内存等能力。

建议每一个都去查查man手册如man madvise,或者官方mannual网站上查看,如madvise(2)-man7.org

下面简要介绍:

模块介绍