歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多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 給




Copyright © Linux教程網 All Rights Reserved