内核内存分配--关于高内存

Linux物理内存分为三个管理区, 分别0-16MB的ZONE_DMA, 16-896MB的ZONE_NORMAL以上896MB的ZONE_HIGHMEM这是高内存.

至于为什么这样分, ZONE_DMA很好理解, 因为ISA公交车只能到前16MB进行DMA寻址, 这块要分出来不能乱用. 而ZONE_NORMAL和ZONE_HIGHMEM为什么从896MB区分呢? 这还得从物理地址和虚拟地址说起.

默认情况下, 内核空间是指3GB-4GB的虚拟地址, 用户空间则是0-3GB. 内核进程和用户进程分别活动在自己的空间内. 这里重点说内核空间, 3G-(3G+896MB)这块是直接映射, 减去PAGE_OFFSET(0xC000000)就是真实物理地址, 剩下那128MB(4G-3G-896MB)是用来做各种映射的, 包含整个高端内存的映射, 假设不留出这么一段做映射, 内核就仅仅能管理1G的物理内存, 余下部分就仅仅能浪费了.

这里有个小难点. 有人会问, “假设剩下那些映射给用户空间, 内核不就能够无论了么, 高端内存也就不须要了吧?” 此言差矣, 点出来也就是一句话的事儿: 用户空间的内存使用也是内核分配的, 内核当然要有能力控制全部硬件资源.

PS: 以上都是基于x86架构, x86_64没有高内存, 一些MIPS32从默认的处理器高内存256MB开始.

版权声明:本文博客原创文章,博客,未经同意,不得转载。

原文地址:https://www.cnblogs.com/zfyouxi/p/4733714.html