Linux内存管理之高端内存

本文介绍了Linux内存管理的三层结构Node、Zone、Page,重点关注高端内存(ZONE_HIGHMEM)。在32位系统中,高端内存是3-4GB间无法直接映射的物理内存。内核通过vmalloc映射技术,利用128MB的线性地址空间循环映射高于896MB的物理内存。在64位系统中,高端内存的概念不复存在。文章还探讨了用户空间与内核空间对内存的访问限制,并解释了为何不全部分配给内核。
摘要由CSDN通过智能技术生成

Linux对内存的管理划分成三个层次,分别是Node、Zone、Page。对这三个层次简介如下:

层次 说明
Node(存储节点) CPU被划分成多个节点,每个节点都有自己的一块内存,可以参考NUMA架构有关节点的介绍
Zone(管理区) 每一个Node(节点)中的内存被划分成多个管理区域(Zone),用于表示不同范围的内存
Page(页面) 每一个管理区又进一步被划分为多个页面,页面是内存管理中最基础的分配单位

它们之间的关系,用一张经典的图表示如下:图片来源

接下来我们重点讲述的是ZONE_HIGNMEM,也就是高端内存。

1 高端内存的由来

在32bit的x86机器中,4G的虚拟地址空间被划分成3G的用户空间(0—3G),1G的内核空间(3-4G)。在64bit的机器中于此不同。也就是说虚拟地址空间从0x0000 0000~0xBFFF FFFF为用户空间,0xC000 0000~0xFFFF FFFF为内核空间。Linux把每个内存节点的物理内存划分成3个管理区,也就是划分成ZONE_DMA、ZONE_NORMAL、ZONE_HIGHMEM。它们的介绍如下:

内存区域 说明
ZONE_DMA 范围是0~16M,该区域的物理页面专门供I/O设备的DMA使用
ZONE_NORMAL 范围是16~896M,该区域的物理页面是内核能够直接使用的
ZONE_HIGHMEM 范围是896~结束,高端内存,内核不能直接使用

上面说到虚拟地址空间中的3~4G为Linux内核虚拟地址空间,其中内核空间3G~3G+896M对应物理内存空间的0~896M,并且在内核初始化时就已经将3G~3G+896M(0xC0000 0000~0xF7FF FFFF)虚拟地址空间与物理内存空间的0~896M进行了对应,内核在访问0~896M的内存的时候,只需要将其对应的虚拟地址空间增加一个偏移量就可以了。对于超过896M的物理地址空间,它们属于高端内存,高端内存区包含的内存页不能由内核直接访问,尽管它们也线性地映射到了线性地址空间的第4个G。也就是说对于高端内存区,只有128M的线性地址(0xF800 0000~0xFFFF FFFF)留给它进行映射。

有这样一个问题:内核虚拟地址空间只有1G,也

  • 13
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值