关于内存分配,一般的 C 语言开发者使用的更多的是 glibc 库提供的 malloc 和 calloc 等函数,这些函数执行成功,这会返回一个进程所需要的内存起始地址,当然,他们是针对 CPU 端的虚拟地址。Linux 内核负责与硬件打交道,针对 CPU 端的虚拟地址很多场景下都不满足需要,固这些函数在内核状态下无法运行,所以内核提供了自己的一套专门的内存申请释放函数
进程在执行过程中,Linux 内核需要根据需要分配给核外进程一块内存区域,进程就把这一片区域作为工作区按照自己的需要执行工作流。对于核外进程来讲,他所看到的地址是不固定的,每一次申请得到的起始地址也是未知的,因此对于内核来讲,他需要更好的动态管理内存,因为核外进程经常是成千上万的,但是实际的物理内存空间是有限的,所以 Linux 内核需要高效的处理内存分配问题。
物理与虚拟内存
虽然现在多数系统都是 64bit,但是很多理念是从 32bit 延展而来的,有必要好好的对比 32bit 和 64bit 的内存动态管理方式。要区分当前运转的系统是 64bit 操作系统还是 32bit 操作系统有很多方法,其中一种就是是否支持 4GB 以上的虚拟地址空间。我们从图 1 中来稍微观察一下这两个不同 bit 宽度的系统的内存布局情况。
是不是懵逼了,和你听过的或者老师讲过的是不是不太一样?尤其是左边的映射关系,刚刚上面不是讲了 32bit 最多 4