当前位置:Linux教程 - Linux综合 - IA-64 Linux 存储管理

IA-64 Linux 存储管理

  采用显式并行指令计算(EPIC)结构的安腾处理器是 Intel 公司新一代 64 位处理器,HP、SGI、Intel 等大公司都纷纷推出了高性能的安腾服务器系统。Linux 是目前支持 IA-64 服务器平台的主流操作系统之一。本文重点描述了 IA-64 Linux 存储管理,包括 IA-64 Linux 灵活的地址空间划分、页表、TLB 等机制。     一 引言  Intel 公司的 IA-64 架构是一种经济高效、伸缩自如、性能卓越的 64 位计算平台。从技术角度看,与一般处理器采用的超标量技术不同,IA-64 架构的主要特色是采用 EPIC 结构。EPIC 结构利用编译器挖掘应用程序的指令级并行性,并通过生成的机器语言以显式方式指导硬件执行程序,降低处理器硬件的复杂度,并通过编译软件挖掘出更多、更大范围内的指令级并行,EPIC 架构代表了当前处理器设计的新思想。     Intel 公司已成功推出安腾和安腾 2 处理器,安腾 2 处理器在 SPECfp2000 测试中的性能表现非常突出,仅在 SPECfp2000 Peak 测试中略微落后于 Alpha21364,在 SPECfp2000 Base 的测试中则名列榜首。与此同时 Intel 公司非常注重 IA-64 架构操作系统的开发,早在 1999 年,Intel 公司就联合 HP、SGI、RedHat、VA Linux 和 IBM 启动了 Intel IA-64 的 Trillian 项目,该项目旨在完成 Linux 在 IA-64 平台的移植和优化,许多成员为该项目做出了贡献,如 HP 完成内核,IBM 完成性能分析工具和评测,Intel 完成内核和 EFI(Extensible Firmware Interface),RedHat 完成 GNUPRO 开发工具,SGI 完成编译器和 kdb 等。目前,Red Hat、TurboLinux、Caldera 和 SuSe 都已发布了支持 IA-64 架构的 Linux 版本,Linux 已成为支持 IA-64 架构的重要操作系统,HP 公司的 David Mosberger 维护和管理 IA-64 Linux 项目,并已融入到 Linux 内核版本中。     二 IA-64 Linux 地址空间划分   从用户角度看,Linux 进程的虚地址是线性的,它分为两部分:内核空间和用户空间。用户空间占据地址的低部分,从 0 到 TASK_SIZE(TASK_SIZE 的值是与具体的硬件平台相关的,在 include/asm/processor.h 中定义),剩余部分为内核空间。用户空间对进程是私有的,该地址由进程的页表维护管理,内核空间是所有进程共享的。在用户态下运行时,只可以访问用户空间,对内核空间的读/写/执行都将导致保护冲突故障,这可以防止出错或恶意的用户代码破坏内核;在内核态运行,则可以访问用户和内核空间。     IA-64 架构支持 64 位虚地址空间,它将 64 位虚地址空间分成 8 个相等的区,每个区 2048P 字节大小,用虚地址的高 3 位(61-63 位)表示区号。如图 1 所示           图1 IA-64 虚地址空间    目前应用对虚地址的需求还没有达到全 64 位,因此实现时并不需要支持全 64 位虚地址,IMPL_VA_MSB 常量用于决定未实现的虚地址空间范围,它的值可以在 50-60,IMPL_VA_MSB+1 至 60 是未实现的虚地址位,未实现的地址位通过虚地址的低地址位符合扩展而成,如果 IMPL_VA_MSB 值小于 60,则符合扩展将某个区的虚地址空间分成两部分,未实现部分在中间,如图 2 所示(IMPL_VA_MSB=50)。对未实现部分的访问是不允许的,如果是用户态的访问,则产生非法指令错;如果是核心态的访问,则操作系统内核崩溃。          Linux/IA-64 用户空间大小仍旧由 TASK_SIZE 常量所定义,在 IA-64 中使用 0-4 区作为用户空间,5-7 区作为核心空间,PAGE_OFFSET 常量指向第7区,如图 3 所示。内核空间可以进一步划分为页表映射段和对等映射段。页表映射段是由内核页表映射的,主要用于实现内核的 vmalloc 区域,内核用 vmalloc 区域实现虚地址连续的大内存块分配,该区域的地址范围由 VMALLOC_START和VMALLOC_END 决定的。对等映射段包含 Linux 的内核,如内核的正文段、数据段和栈段。对等映射是非常特殊的,该段的虚地址可以直接与物理地址映射,映射公式非常简单,通常是虚地址直接减一个基地址(如,PAGE_OFFSET)就得到物理地址。          图 3 IA-64 Linux 地址空间划分    在核心空间中,7 区实现 Cache 的对等映射,6 区实现非 Cache 的对等映射,5 区实现内核页表映射段。5 区中的第一页称为 guard 页,该页不被映射,对该页的任何访问都将产生一次页故障,该页用于在用户空间和核心空间数据拷贝时的快速权限检查。第二页称为 gate 页,用于支持核心和用户级的转换。第三页称为 per-CPU 页,它提供每个 CPU 的本地信息,用于多处理器系统。5 区中剩余部分用于 vmalloc 区,从 VMALLOC_START 到VMALLOC_END。Linux/IA-64 中各区的特性如下表所示,     区号 使用 页大小 范围 映射方式   7 Cache 256MB 全局 对等   6 非Cache 256MB 全局 对等   5 vmalloc, guard, gate 8K 全局 页表   4 栈段 8K 进程 页表   3 数据段 8K 进程 页表   2 正文段 8K 进程 页表   1 共享内存 8K 进程 页表   0 IA-32模拟 8K 进程 页表     Linux/IA-64 基于区的地址空间划分与传统的 X86 体系结构不同,具有以下优势:(1)可以充分利用 IA-64 提供的支持多种物理页大小特性,通过区号实现不同页大小的区,如,操作系统内核代码和数据在7区,采用 256MB 大小的页,用户进程的正文段在 2 区,采用 8KB 大小的页,从而有效节约系统的硬件资源,提高系统性能。(2)便于应用程序的扩展。用户进程的正文段、数据段、栈段在不同的区,而每个区之间相差 2048P 字节,因此正文段或数据段的扩展不会引起各段之间的地址重叠。(3)便于实现基于区的共享和保护。     三 页表   IA-64 Linux 在物理内存中为每个进程维护一个页表并通过第7区的对等映射内核段访问该页表。页表驻留在内存,不能被交换到磁盘,这可以简化内核设计,因为内核不需要考虑嵌套的页故障。目前主流的硬件平台不支持可变的页尺寸,如:X86 只支持两种尺寸的页框:4KB 或 4MB(如果支持 PAE,还有 2MB),IA-64 支持 4KB、8KB、16KB、64KB、256KB、1MB、4MB、16MB、64MB 和 256MB 多种页框尺寸,因此页机制更加灵活方便。目前 IA-64 Linux 仍旧采用三级页表树结构,每个页框 8KB,每级目录占据一个页框,每项 8 字节大小,由全局目录(PGD)、中间目录(PMD)、页表项(PTE)组成。IA-64 Linux 用户空间虚地址格式为           图 4 用户空间虚地址格式(8 KB页)    其中,全局目录索引被分为 pgdh(3位)和 pgdl(7位),将全局目录索引分成两部分可以通过虚地址的高 3 位映射到每个区,ar.k7 寄存器指向当前进程的页表树的基地址。第 5 区至第 7 区是为内核预留的,用户进程不允许将 pgdh 大于 5 的任何地址映射到用户空间,IA-64 Linux 通过设置 FIRST_USER_PGD_NR 为 0,USER_PTRS_PER_PGD 为 640 来实现,因此在进程页表的全局目录中有 3/8(5 区、6 区、7 区)的地址空间没有用。          图 5 页表映射内核段虚地址格式(8KB 页)    内核使用一个独立的页表来管理页表映射内核段,与用户空间每个进程一个页表不同,该页表属于整个内核,而且与当前正在运行的进程无关。IA-64 Linux 用第 5 区实现页表映射内核段。61 位至 63 位固定值为 5,全局目录从 33 位至 42 位,没有像用户虚地址空间页表一样分成两部分,而是连续的。     IA-64 页表项支持短模式和长模式。短模式每个页表项 8 个字节,是一个线性页表,短模式可以使用自映射页表。长模式每个页表项 32 个字节,是一个 Hash 页表,Hash 功能嵌入在硬件中,长模式支持在同一个域内的保护字和多种页尺寸。Linux 页表采用短模式,便于将 Linux 页表与 VHPT walker 有机结合,而长模式可以为每个页表项指定不同的保护字,因此 TLB 效率较高,但使用长模式需要额外的内存空间和转换工作保证页表的 Cache 一致性。     四 TLB   Linux/IA-64 虚实地址变换由 IA-64 的 TLB(Translation Lookaside Buffer)机制和 Linux 虚存管理协同工作实现的,高效的虚实地址变换可以极大提高 Linux 的性能。IA 64 TLB 从逻辑上可以分成指令的 ITLB 和数据的 DTLB,ITLB 又分为 ITC、ITR,DTLB 又分为 DTC、DTR,如图所示。          图 6 IA-64 TLB 组织    TC(Translation Cache)和TR(Translation Register)的区别是替换策略的不同,TC 的替换策略是由硬件控制的,而 TR 的替换策略是由软件指定的,因此 TR 具有以下特性:软件在 TR 中插入一个映射后,除非软件又插入一个新的映射或清除了该映射,否则该映射一直有效。Linux/IA-64 用 TR 完成关键地址的变换,保证对关键地址的内存访问都能命中 TLB,减少 TLB 失效次数。由于处理器中 TR 资源有限,Linux/IA-64 采用一个大页(256MB),通过 TR 寄存器将内核的代码和数据映射在 7 区,通过对等映射快速完成虚实地址变换,目前 IA-64 Linux 中 ITR0 映射 Linux 的内核代码,DTR0 映射内核只读数据,ITR1 映射 EFI(Extensible Firmware Interface)需要的 PALcode,DTR1 映射每个 CPU 的数据,DTR2 映射内核栈。     IA-64 架构除了基本的 TLB 功能外,还提供区(region)寄存器、保护字(protection key)寄存器和 VHPT(Virtual Hash Page Table)walker 三种硬件结构加速虚实地址变换。图 7 给
[1] [2] 下一页 

(出处:http://www.sheup.com)


上一页 [1] [2]