Linux虚拟内存组织结构浅析(一)


分类:  Linux虚拟内存管理2008-09-20 10:48 1100人阅读  评论(0)  收藏  举报

众所周知,linux内核支持绝大多数体系结构,因此linux内核必须采取一种与具体体系结构无关的方法来描述物理内存的组织结构,这个问题就是本系列文章要讨论的话题。

 

要理解linux虚拟内存在逻辑上的组织结构,我们首先要明白两个概念:UMA(Uniform Memory Access)、NUMA(Non Uniform Memory Access)。UMA指一致性内存访问,这是单CPU机器常用的体系结构,在这种结构下,CPU访问系统内存的任何存储位置的代价都是一样的;而NUMA是指非一致性内存访问,常用于多CPU机器,在这种体系结构中,不同内存相对于不同的CPU而言所处的位置不一样,最典型的就是每个CPU都有自己的本地内存(Local Memory),不同CPU之间通过总线连接起来,如图1所示。在这种结构中,CPU访问本地内存的代价比访问远端的内存代价要小。

 

 

为了支持NUMA,Linux将物理内存划分成不同的节点(node),节点用结构体pg_data_t表示,以上图为例,图中每个CPU的本地物理内存都称为一个节点;即使在UMA结构中也有节点的概念,此时系统中就只有一个节点;系统中的多个节点被连接起来保存在一个称为pgdat_list的链表上。每个节点又被划分成不同的区(zone),节点是通过其结构体内的数组node_zones来跟踪节点内的区的。区是指一个节点内一段连续的物理内存范围。Linux中主要有3个区:ZONE_DMA、ZONE_NORMAL、ZONE_HIGHMEM,它们的划分如下:ZONE_DMA位于物理内存开始的一段区域内,主要用来供一些ISA设备使用;ZONE_NORMAL位于ZONE_DMA后面,这个区域被内核直接映射到线性地址的高端部分;ZONE_HIGHMEM指系统中剩下的物理内存,这个区域不能直接被内核映射。为了清晰起见,我们可以看看在x86平台上的区是如何划分的:

                     ZONE_HIGHMEM —— 物理内存起始16M

                     ZONE_NORMAL —— 16M—896M

                     ZONE_HIGHMEM —— 896M—物理内存结束

 

  最后,在每个区中都有一个指向mem_map数组中某个单元的指针zone_mem_map,这是干什么的呢?通过查看源代码我们可以知道,mem_map是类型为struct page的数组,而Linux内核正是利用struct page结构体来描述每个物理内存页的,在系统启动时,内核就会为整个系统的内存建立好一个全局的页描述数组mem_map,在以后的运行过程中,Linux内核最终就是根据这个全局内存描述数组来控制对物理内存的分配、回收等操作的。明白了mem_map的作用,我们再来看看每个区中的zone_mem_map指针,这个指针指向的是mem_map中的某一个单元,而这个单元的内容恰恰描述了这个区内的第一页物理内存,这样Linux就把节点、区、page结构联系起来了,它们共同组织起来完成了对系统所有物理内存的描述。因此,我们现在就可以清晰地得出Linux在逻辑上是如何描述所有的物理内存了,其图如图2所示:

 

分享到: 
查看评论

  暂无评论

发表评论
  • 用 户 名:
  • fh400
  • 评论内容:
  • 插入代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值