Chinaunix首页 | 论坛 | 博客
  • 博客访问: 468669
  • 博文数量: 185
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 681
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-06 21:45
个人简介

为梦而战

文章分类

全部博文(185)

文章存档

2016年(3)

2015年(103)

2014年(79)

我的朋友

分类: LINUX

2014-04-15 10:33:27

一、概述
1.节点(node)
    一些多处理器系统硬件支持NUMA(非一致内存访问),这种体系会使用多条系统总线,每条总线为一个(组)处理器服务。每个(组)处理器都有自己的本地内存,处理器之间通过总线连接起来以支持对其他(组)处理器本地内存的访问。这样物理内存就被划分为了不同的节点(node),每个(组)处理器访问本地内存比访问与其他节点关联的内存快,因此具有非一致性。
    本地内存是指与当前正在运行线程的处理器位于同一节点上的内存。任何不属于当前正在运行的线程所在的节点的内存均为外部内存。访问外部内存的耗时与访问本地内存的耗时之比称为 NUMA 比率。如果 NUMA 比率为 1,则它是对称多处理 (SMP),这样的体系属于UMA 。
    UMA(一致性内存访问)体系的物理内存空间虽然可能会有空洞,但系统的每个处理器对内存的访问具有相同的时间,因此具有一致性,这种情况物理内存关联一个单独的节点。

2.物理页(page)
    物理页是内存管理的基本单位,内存管理单元(MMU)以页为单位处理虚拟地址到物理地址的转换。

3.内存区域(zone)
     每个节点的物理内存又被划分为几个区(zone),区的划分与体系结构大有关联,一些体系结构的ZONE_DMA 或者 ZONE_HIGHMEM为空。
    内核对任何内存的访问都需要使用自己的虚拟地址,然而一些体系如32 位x86在当RAM 大于896M 的情况下并没有将物理内存全部映射到内核虚拟地址,因此内核若是访问大于896M的物理内存必须建立适当的虚拟映射,使该页可以在内核地址空间访问。这种情况在64位体系中不存在,因为这种体系内核虚拟地址可以映射全部物理内存。
    32位x86体系内存区域的划分为:低于16M的ZONE_DMA ,高于16M且低于896M的ZONE_NORMAL,896M 以上的ZONE_HIGHMEM。

4.内核空间的地址划分
    32位x86系统有4GB 地址空间,一般 将最后一个GB 划分为内核地址空间。有些非x86的32位系统并不使用这种划分,可以拥有4GB的内核地址空间。
    逻辑地址:内核逻辑地址一对一、线性地映射到物理内存,大多数体系中,逻辑地址与相关的物理地址的差别仅是之间存在一个固定的偏移而已,无需建立页表。
    虚拟地址:它的存在是为了映射高端内存,或者动态映射内存,因此与物理地址不一定是线性和一对一(对某页高端内存可多次映射到内核空间),需要建立页表。

    上图为32位x86系统的内核空间划分:
    直接映射区:在__PAGE_OFFSET到high_memory为逻辑地址。
    动态内存映射区:在VMALLOC_START到VMALLOC_END为VMALLOC区,可用来分配虚拟地址连续的物理页,物理页尽量从高端内存分配
    永久映射区:该区允许内存建立高端内存物理页到内核虚拟地址的长期映射,内核由此获得了访问高端内存页的能力。
    固定映射区:在该区内虚拟地址与物理地址间的映射可以在系统启动时任意建立,但定义后不能改变,也因而总可以从TLB 高速缓存来获取关联的物理地址。类比数组名和指针变量之间的区别,指针多了一步获取其指向地址的步骤,在该区内内核使用了固定映射的线性地址代替了指针变量,因此效率变高了。其他一些体系如AMD64也使用这个区。
    这几个区之间会用一些空白,空白并不映射物理内存。这样做是为了捕获越界访问。



    




阅读(490) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~