Embedded 版 (精华区)
发信人: Zinux (Linux技工), 信区: Embedded_system
标 题: IA64地址模式简介
发信站: 哈工大紫丁香 (Wed Oct 17 22:11:04 2001) , 转信
IA64 地址模式和保护
发 表 人:Free_Os(【9611】???) 版面名称:Kernel[1398]
文章提要:IA64地址模式简介
源 发 站:中国科大BBS站(Mon, 15 Oct 2001 20:30:20)
前言
----
下面的内容从IA64 manual vol2 ch.4 中理解(COPY?)过来的。
如果有什么问题,欢迎讨论。在下面我们还将结合Linux下的实现
来看看OS是如何使用IA64提供的机制。
简介
----
在IA64的地址模式中,我们要注意下面的概念:
* Virtual Region (VR)
* Translation Lookside buffer(TLB)
* Virutal Hash Page Table (VHPT)
1) Virtual Region
在IA64的应用程序中看来,虚拟地址空间应该是64bit的一维线形
空间(flat liner virtual address);而在实现中,IA64把虚拟地址空间
分成8个2^61的虚拟区域(Virtual Region)。64bit中的高3bit用于确定地址
所在虚拟区域。3bit确定的称为Virtual Region Number(VRN);
+----+-------------------------+
|VRN | VPN | Offset |
+----+-------------------------+
3bit 61bit \
/ \
/ \
RR 0-7 \
+-----+ \
| | \
+-----+ \
| ... | \ \
| ... | \ 24bit-RID \
+-----+ \ \
\ \
+-------+ \
| Hash | \
+-------+ \
| \
|search \
| V (TLB,VHPT)
+----------+-----+-------+--------+-----+
|Region ID | KEY | VPN | Rights | PPN |
+----------+-----+-------+--------+-----+
| ... |
+---------------------------------------+
|
v
+------------+---------------+
| PPN | Offset |
+------------+---------------+
在IA64中使用的8个用于保存关于虚拟区域(Virtual Region)的寄存器,称为
Region Register(RR);VRN就用于选择其中的某个寄存器。RR寄存器目前格式
是(64bit total):
+----+------------+--------+----+----+
| Res| Rid(24ibt) | PS |1bit|1bit|
+----+------------+--------+----+----+
Region ID(Rid), 是系统中虚拟区域(Virtual Region)的标识,24bit,因此在
系统可以有2^24个虚拟区域(Virtual Region)。这个数字是相当可观的。
Page Size(PS),2^PS是在该虚拟区域(Virtual Region)中的页面的大小。目前是从
4k-256M的页面大小。不同的虚拟区域(Virtual Region)可以有不相同的页面大小。
Virtual Page Number(VPN),是区域中的页面,其bit位是根据该区域中页面大小来
确定的。
2)TLB
在IA64中的TLB地位是很重要的;
与IA32体系一样,IA64中的分为Data TLB 和 Instruction TLB;
与IA32体系不一样的是,TLB又分为两个子部分:Translation Register和Translation
同时IA64中提供指令对TLB插入,删除,而不仅是清除(flush)。用户可以对TLB进行更仔细
在继续之前,我们来了解一下TLB的作用。“对一个虚拟地址在进行地址转换时,用VRN?
并用RR中的RID结合VPN来查找相应的物理页(PPN),。。。”
很明显,在地址转换过程中,TLB用于快速确定VPN对应的物理页面。这种设计是必要的?
在IA64中,64bit的地址空间若使用单纯的多级页表来实现显然在速度上是来不可取的。在
中使用HASH表查询来提高效率。同时在IA64中,把对TLB的管理交给OS去管理了,就是当I
A
MISS的时候,便产生一个fault由OS将所需的页面调入,并在TLB插入该映射。请仔细体会
?
的处理的不同,I386中CPU需要遍历页表来确定映射,如果缺页,那么就由OS页面调入,并
?
空间到物理空间的映射。在这个意义上,IA64中TLB跟I386中页表是很相似的。
3)VHPT
VHPT可以视为是TLB的扩充版。TLB在实现中毕竟是有限的;VHPT具有一定的数据数据结?
并位于内存中。与TLB相似,对VHPT的查找是有CPU来做的,维护交给OS来处理。VHPT并不
?
分析
----
1)
我们先来看看在Linux中对RR的应用。
$cat haha.c
#include "stdio.h"
int main(int argc ,char *argvp[])
{
printf("haha\n"):
}
$gcc haha.c -o haha
$objdump -x haha >haha.x
$more haha.x
PHDR off 0x0000000000000040 vaddr 0x4000000000000040 paddr 0x40000000000
filesz 0x0000000000000188 memsz 0x0000000000000188 flags r-x
INTERP off 0x00000000000001c8 vaddr 0x40000000000001c8 paddr 0x40000000000
filesz 0x0000000000000018 memsz 0x0000000000000018 flags r--
LOAD off 0x0000000000000000 vaddr 0x4000000000000000 paddr 0x40000000000
filesz 0x0000000000000970 memsz 0x0000000000000970 flags r-x
LOAD off 0x0000000000000970 vaddr 0x6000000000000970 paddr 0x60000000000
filesz 0x0000000000000230 memsz 0x0000000000000278 flags rw-
DYNAMIC off 0x0000000000000a10 vaddr 0x6000000000000a10 paddr 0x60000000000
filesz 0x0000000000000150 memsz 0x0000000000000150 flags rw-
NOTE off 0x00000000000001e0 vaddr 0x40000000000001e0 paddr 0x40000000000
filesz 0x0000000000000020 memsz 0x0000000000000020 flags r--
0x70000001 off 0x0000000000000940 vaddr 0x4000000000000940 paddr 0x400000000
filesz 0x0000000000000030 memsz 0x0000000000000030 flags r--
我们可以看出,在.data .text 不是在一个Region(区域)中;
0x60000000000..: 0110(6) -> REGION ID为3;
0x4000000000...: 0100(4) -> REGION ID为2
2)
我们知道Linux在VM设计上,使用的是平台无关的3级页表。
在IA64中,把VPN分成3级页表,并指定一个内核寄存器来保存页表的地址。在这个意?
是完全由OS来定义和管理。
而在IA32中,Processor定义了页表的格式,定义了用于保存页表地址的寄存器;当进
是由Processor来查询页表来抛出fault;大家很容易看出差别。
Booting Linux IA64 ...
----------------------
* Relative files:
$/arch/ia64/
+vmlinux.lds.S
$/arch/ia64/kernel/
+ head.S
+ init_task.c
$/init/
+ main.c
* Switch into Virutal Mode:
As we known, $/arch/ia64/boot/bootloader.c, will transfer CPU control
--
※ 来源:.哈工大紫丁香 http://bbs.hit.edu.cn [FROM: 202.118.239.146]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.499毫秒