Linux 64bit存储管理.docx
- 文档编号:5705776
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:7
- 大小:253.82KB
Linux 64bit存储管理.docx
《Linux 64bit存储管理.docx》由会员分享,可在线阅读,更多相关《Linux 64bit存储管理.docx(7页珍藏版)》请在冰豆网上搜索。
Linux64bit存储管理
LinuxIA-64存储管理
一.IA-64linux地址空间划分
IA-64架构支持64位虚拟地址空间,它将64位虚拟地址空间分成8个相等的区,每个区2048P字节大小,用虚拟地址的高3位表示区号。
如下图所示:
图1.IA-64虚拟地址空间
在IA-64中使用0~4作为用户空间,5~7作为核心空间,PAGE_OFFSET常量指向第7区,如图2所示。
内核空间可以进一步划分为页表映射段和对等映射段。
页表映射段是由内核页表映射的,主要用于实现内核的vmalloc区域,内核用vmalloc区域实现虚拟地址连续的大内存块分配,该区域的地址范围由VMALLOC_START和VMALLOC_END决定。
对等映射段包含Linux的内核,如内核的正文段、数据段和栈段。
对等映射是非常特殊的,该段的虚拟地址可以直接与物理地址映射,映射公式非常简单,通常虚拟地址直接减一个基地址(如PAGE_OFFSET)就得到物理地址。
图2.IA-64虚拟地址空间划分
Linux/IA-64中各区特性如表1所示:
表1.Linux/IA-64中各区的特性
二.页表
IA-64Linux在物理内存中为每个进程维护一个页表,并通过第7区的对等映射内核段访问该页表。
页表驻留在内存,不能被交换到磁盘,IA-64支持4KB,8KB,16KB,64KB,256KB,1MB,4MB,16MB和256MB多种页框尺寸。
目前IA-64Linux仍旧采用三级页表树结构,每个页框8KB,每级目录占据一个页框,每项8字节大小,由全局目录(PGD)、中间目录(PMD)、页表项(PTE)组成。
IA-64Linux用户空间虚地址如图3所示。
图3.用户空间虚拟地址(8KB)
其中全局目录索引被分为pgdh(3位)和pgdl(7位),将全局目录索引分成两部分,可以通过虚拟地址的高3位映射到每个区,ar.k7寄存器指向当前进程的页表树的基地址。
第5区至第7区是为内核预留的,用户进程不允许将pgdh大于5的任何地址映射到用户空间。
IA-64Linux通过设置FIRST_USER_PGD_NR为0,USER_PTRS_PER_PGD为640来实现,因此,在进程页表的全局目录中有3/8(5区,6区,7区)的地址空间没有用,如图4所示。
图4.页表映射内核段虚拟地址(8KB)
内核使用一个独立的页表来管理页表映射内核段,与用户空间每个进程一个页表不同,该页表属于整个内核,而且与当前正在运行的进程无关。
IA-64Linux用第5区实现页表映射内核段。
61位至63位固定值为5,全局目录从33位至42位,没有像用户虚地址空间页表一样分成两部分,而是连续的。
三.TLB
Linux/IA-64虚实地址变换由IA-64的TLB(TranslationLookasideBuffer)机制和Linux虚存管理协同工作实现的,高效的虚实地址变换可以极大提高Linux的性能。
IA64TLB从逻辑上可以分成指令的ITLB和数据的DTLB,ITLB又分为ITC、ITR,DTLB又分为DTC、DTR,如图5所示。
图5IA-64TLB组织
TC(TranslationCache)和TR(TranslationRegister)的区别是替换策略的不同,TC的替换策略是由硬件控制的,而TR的替换策略是由软件指定的,因此TR具有以下特性:
软件在TR中插入一个映射后,除非软件又插入一个新的映射或清除了该映射,否则该映射一直有效。
Linux/IA-64用TR完成关键地址的变换,保证对关键地址的内存访问都能命中TLB,减少TLB失效次数。
由于处理器中TR资源有限,Linux/IA-64采用一个大页(256MB),通过TR寄存器将内核的代码和数据映射在7区,通过对等映射快速完成虚实地址变换,目前IA-64Linux中ITR0映射Linux的内核代码,DTR0映射内核只读数据,ITR1映射EFI(ExtensibleFirmwareInterface)需要的PALcode,DTR1映射每个CPU的数据,DTR2映射内核栈。
IA-64架构除了基本的TLB功能外,还提供区(region)寄存器、保护字(protectionkey)寄存器和VHPT(VirtualHashPageTable)walker三种硬件结构加速虚实地址变换。
图6给出了在IA-64架构下虚地址到实地址的变换。
IA-64通过VPN和RID的HASH在TLB表中寻找匹配项,如果匹配且权限和保护字寄存器检查有效,则获得PFN,与虚地址的OFFSET拼接形成物理地址。
如果没有匹配项且VHPTwalker赋能,则处理器在内存页表中寻找匹配项,如果找到,则自动将它插入到TC中,否则产生TLB不命中故障,由LinuxTLB不命中处理函数处理。
图6IA-64虚实地址变换
1VHPTwalker
IA64VHPTwalker是硬件实现的,用于加速TLB查找,可有效降低TLB不命中时操作系统的处理开销。
当TLB不命中且VHPTwalker赋能时,VHPTwalker在内存的特殊页表中寻找匹配项,并自动填充不命中的TLB项,而不需要操作系统的参与。
如果屏蔽了VHPTwalker,则CPU产生TLB不命中故障,然后由Linux内核处理。
由于硬件实现VHPTwalker,因此它的使用有一定限制,目前只支持两种模式:
hash模式和线性页表模式。
Linux使用短模式。
VHPTwalker的配置是由页表地址控制寄存器PTA决定的。
在发生TLB不命中,且该地址所在的区寄存器的VHPT位和PTA的ve位为1,则激活VHPTwalker,PTA的vf位确定是长模式还是短模式。
PTA的base和size域定义虚拟线性页表在该区的地址范围。
每个区的VHPTwalker可以分别禁用(通过设置区寄存器的VHPT位),在允许VHPTwalker的区内,虚拟线性页表映射在每个区的相同相对位置。
虚拟线性页表不能与正常页表映射的地址空间重叠,并且也不能与前面提到的该区中间的地址空洞重叠。
Linux/IA-64通过设置PTA寄存器,将虚拟线性页表映射在该区的顶端,操作系统在引导时检查是否有重叠。
当访问虚地址va发生TLB不命中时,VHPTwalker计算映射虚地址va的页表项所在虚地址va',使用虚拟映射线性地址页表,该地址计算如下:
VHPTwalker去读取存储在该地址的页表项,由于该地址也是一个虚地址,CPU将进行正常的虚实地址变换,如果va'的TLB项存在,则变换成功,walker从物理内存中读取页表项,并安装va的页表项。
如果va'的TLB项不存在,则walker产生VHPTTRANSLATIONFAULT。
VHPTwalker不能直接访问Linux页表,因为它不知道Linux的页表结构。
采用VHPT主要是从空间局部性上考虑,因为映射某个页表项的TLB项事实上映射了该页表项所在的整个页,在安装完该页表页的TLB项后,访问同一页内页表项的TLB不命中可以由VHPTwalker直接处理,有效减少了Linux参与TLB不命中的故障处理次数。
2.懒惰的TLB刷新
为了避免操作系统每次现场切换时刷新TLB的高额开销,Linux定义了与具体平台无关的抽象ASN(AddressSpaceNumber)接口,通过该接口可以实现懒惰的TLB刷新,在现场切换时不需要刷新所有的TLB表项。
ASN接口的支持是可选的,如果具体平台不支持,则这些接口函数为空,flush_tlb_mm()就刷新所有的TLB。
Linux/IA-64采用区ID实现ASN接口,虽然IA-64定义了24位的区ID,但安腾处理器只使用了18位。
Linux/IA-64中区ID0是为内核预留的,剩余的ID通过get_mmu_context()以轮转方式分配,当最后一个可用区ID分配完后,刷新整个TLB,并重新计算可用区ID的范围。
get_mmu_context()返回的区ID是所有CPU共享的,这种全局区ID分配策略对单处理器和小规模的多处理器系统是十分有效的,它可以使用一条ptc.ga指令清空该机器所有CPU的TLB项,但当机器的CPU数目较多时,全局区ID分配会成为潜在的竞争资源。
四、交换空间
内核管理系统需要将暂时不用的内存数据转储到外存中,Linux采用两种方式保存换出的页面:
一种用整个设备,如硬盘的一个分区,称为变换设备;另一种用文件系统中固定长度的文件,称为交换文件。
它们统称为交换空间。
这两种交换方式的内部格式是一致的。
前4096字节是一个以字符串“SWAP-SPACE”结尾的位图。
位图的每一位对应一个交换空间的页面,置换表示对应的页面可用于换页操作。
每4096字节之后才是真正存放换出页面的空间。
这样,每个交换空间最多可容纳(4096-10)*8-1=32687个页面。
一个交换空间可能不够用,因而Linux允许并行管理MAX_SWAPFILES个交换空间。
MAX_SWAPFILES默认值为8.
交换空间的头部部分由结构swap_header描述,结构如下:
unionswap_header{
struct{
//reseved位图的每一位对应一个交换空间页面
charreserved[PAGE_SIZE-10];//
charmagic[10];//是SWAP-SPACE或SWAPSPACE2
}magic;
struct{
charbootbits[1024];
unsignedintversion;
unsignedintlast_page;
unsignedintnr_badpages;
unsignedintpadding[125];
unsignedintbadpages[1];
}info;
};
交换设备比交换文件有效的多。
在交换设备中,属于同一页面的数据块总是连续存放的。
第一个数据块一经确定,后续的数据块可以按顺序读出或写入。
而在交换文件中,属于同一页面的数据虽然在逻辑上是连续的(在交换文件的位图看来),单数据块的实际位置可能是零散的,需要通过交换文件的inode检索,这决定于拥有交换文件的文件系统。
Linux拥有一个按优先级排序的有效交换设备列表。
当需要分配一个交换页面时,Linux会在仍然拥有空间的优先级最高的交换设备上来分配它。
所有的交换空间以全局结构数组swap_info来管理,每注册一个交换空间时,就向swap_info数组中填充一项,这个数组定义如下
Structswap_info_structswap_info[MAX_SWAPFILES];
下面是structswap_info_struct结构,交换设备用structswap_info_struct结构体类型来表示。
这个结构说明如下:
Structswap_info_struct{
Unsignedintflags;//(SWP_USEDorSWP_WARITEOK)用做控制访问交换文件
Kdev_tswap_device;//发生交换的设备号。
如果struct代表一个文件而不是分区,值是0.
Spinlock_tsdev_lock;
Structdentry*swap_file;//struct代表的交换文件或分区。
Structvfsmount*swap_vfsmnt;
//swap_map为在交换文件中每一页保留了一个字节,0代表可用页,128代表不可用页。
字节的值代表引用该页面的进程数。
unsignedshort*swap_map;
unsignedintlowest_bit;//跟踪交换设备里第一个可用页面的位置
unsignedinthighest_bit;//跟踪交换设备里最后一个可用的页面的位置
unsignedintcluster_next;//上次分配的交换页面的下一个页面的位置
unsignedintcluster_nr;//当前簇中可供使用的交换页面的个数
intprio;//交换设备的优先级
intpages;//设备上可用的页面数目。
unsignedlongmax;//内核在此设备中允许的最大页面数目
intnext;//下一个元素
};
交换文件是放在物理磁盘上的,因此将所有的交换页面按簇为单位存储,每簇内的页面连续存放。
内存中的一页被换出时,首先通过调用scan_swap_map来寻找一个交换空间中的可用交换页。
它先查看cluster_nr即当前簇中的可用交换页面数是否为零,如果不是,则从紧接着上次成功分配的空闲页面后面的那张页面cluster_next开始查找。
如果使用这张页的进程数不为0,继续查下一页。
否则,找到可分配交换页,将此cluster_nr减1后,返回此页面在swap_map中的下标。
如果发现cluster_nr为0,即当前的簇中已经没有可分配的交换页,则尝试从这个交换空间中分配一块全新的簇。
它由lowest_bit指示的页面开始查看,当发现有连续的SWAPFILE_CLUSTER张空闲交换页时,将这块连续空间作为一个簇,在没有完成对SWAPFILE_CLUSTER张页面查看之前,就发现被其他进程使用的交换页,那么从紧接在这页之后的页面开始尝试查找连续SWAPFILE_CLUSTER张空闲页。
如果均没有成功,放弃分配簇块,直接把从lowest_bit开始找到的第一张空闲交换页返回。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 64bit存储管理 64 bit 存储 管理
![提示](https://static.bdocx.com/images/bang_tan.gif)