linux内核空间
Linux 内核空间分为三个区域ZONE: ZONE_DMA, ZONE_NORMAL, ZONE_HIGHMEM
物理地址空间的顶部以下一段空间,被PCI设备的I/O内存映射占据,它们的大小和布局由PCI规范所决定。640K~1M这段地址空间被BIOS和VGA适配器所占据
由于这两段地址空间的存在,导致相应的RAM空间不能被CPU所寻址(当CPU访问该段地址时,北桥会自动将目的物理地址“路由”到相应的I/O设备上,不会发送给RAM),从而形成RAM空洞。
- ZONE_DMA的范围是0~16M,该区域的物理页面专门供I/O设备的DMA使用。之所以需要单独管理DMA的物理页面,是因为DMA使用物理地址访问内存,不经过MMU,并且需要连续的缓冲区,所以为了能够提供物理上连续的缓冲区,必须从物理地址空间专门划分一段区域用于DMA。
- ZONE_NORMAL的范围是16M~896M,该区域的物理页面是内核能够直接使用的。
- ZONE_HIGHMEM的范围是896M~结束,该区域即为高端内存,内核不能直接使用。
ps: kmalloc为DMA分配内存 vmalloc 分配较大内核内存 malloc分配用户空间内存
伙伴算法、slab算法、ptmalloc、tcmalloc使用场景
伙伴算法
伙伴算法的分配单位为页框,管理ZONE_DMA, ZONE_NORMAL, ZONE_HIGHMEM区域。
slab算法
分配单位为字节,slab分配器只管理内核的常规地址空间(直接被映射到内核地址空间的ZONE_NORMAL和ZONE_DMA)。
ptmalloc、tcmalloc
分配单位为字节,ptmalloc、tcmalloc 管理用户空间内存
资料:
https://blog.csdn.net/liushengxi_root/article/details/88377620
https://blog.csdn.net/qq_41683305/article/details/124554490
https://zhuanlan.zhihu.com/p/526148283
https://blog.csdn.net/liushengxi_root/article/details/88377620