ONGL中Root 和 Context

Struts2与ONGL
本文讲解了Struts2框架中ONGL表达式语言的Root和Context概念。通过实例演示了如何利用ONGL进行对象属性的访问与判断,展示了Root作为默认上下文与自定义Context的区别。

这两天在学习Struts2,看ONGL时始终提到Root和Context,搞不清这两个到底有什么关系,查阅了一系列文章之后,似乎有所感悟,如有不正确的地方,还请各位指教

ONGL使用Map来存储对象,在你不指定Map时,它会调用addDefaultContext 方法自动创建一个Map来存储你传进来的对象,而这个Map就是所谓的Root。那么我已经有一个Map了,如何通过ONGL来访问呢?ONGL允许你指定Map,但是你通过ONGL访问你指定的Map时,要在表达式前面加上“#”(不含引号),你所指定的这个Map,就是所谓的Context。Root和Context的关系有点像自己家的和外来的关系一样,当然这里的自己是对ONGL而言的。

看如下代码:

1.Teacher.java

public class Teacher { private String name; private String course; public Teacher() { } public Teacher(String name, String course) { this.name = name; this.course = course; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void setCourse(String course) { this.course = course; } public String getCourse() { return course; } }

2.MyOgnl.java
import java.util.*; import ognl.*; public class MyOgnl { public static void main(String args[]) throws Exception{ Map ctx = new HashMap(); Teacher t1 = new Teacher("LiQi", "ShuXue"); Teacher t2 = new Teacher("WangLing", "YingYu"); Teacher t = new Teacher("ZhangLi", "YuWen"); ctx.put("t1", t1); ctx.put("t2", t2); System.out.println(Ognl.getValue("#t1.course=='ShuXue'&&#t2.course=='YingYu' &&course=='YuWen'?'Matched':'Unmatched'", ctx, t)); } }

结果:
Matched


t1,t2即是预设变量(外来的),上面的表达式通过#引用了ctx中的预设变量.而t(自家的)的引用直接写属性名就可以了.

代码来自:http://blog.youkuaiyun.com/csdn1234/archive/2008/12/04/3443374.aspx

<think>嗯,用户问有没有类似Intel的root tablecontext table的概念。首先,我得先确认用户对这两个概念的理解程度。Root tablecontext table是Intel VT-d技术中的一部分,用于IOMMU的地址翻译访问控制。用户可能是在学习虚拟化技术,特别是硬件辅助的I/O虚拟化部分,所以需要了解其他架构是否有类似的结构。 首先,我应该回忆一下Intel VT-d中的这两个表的作用。Root table是顶层结构,用来指向各个domain的context table,而context table则包含具体设备的地址翻译权限信息。接下来,我需要考虑其他厂商比如AMDARM是否有对应的机制。AMD的IOMMU(以前叫AMD-Vi,现在可能属于SMMU的一部分)应该也有类似的分层结构,比如设备表域表。ARM的SMMUv2或v3可能有不同的术语,比如Stream TableContext Descriptors。 然后,我需要比较这些不同架构中的概念是否在功能上对应。比如,Root table可能对应AMD的Device Table,而context table可能对应AMD的Domain Table。对于ARM的SMMU,Stream Table用来映射设备到Context Bank,而Context Descriptor保存具体的页表信息。这些结构虽然在名称实现细节上不同,但核心功能相似,都是管理设备到内存的地址翻译访问权限。 用户可能是在配置虚拟化环境,需要了解不同硬件平台的IOMMU设置,或者在进行跨平台开发时需要统一理解这些概念。因此,回答时需要明确各厂商的术语,并指出它们在功能上的对应关系,帮助用户建立知识框架。 另外,用户可能没有明确说明他们的使用场景,但根据问题,他们可能在进行系统级开发、虚拟化技术研究或性能优化。需要确保解释清晰,结构分明,对比不同架构的实现,并强调功能上的相似性,而不仅仅是术语差异。同时,可能需要提醒用户注意不同版本硬件之间的差异,比如ARM SMMUv2v3的变化,以及AMDIntel在实现上的不同点。 最后,总结这些概念的重要性,帮助用户理解它们在虚拟化安全中的作用,比如DMA重映射、隔离保护等,这样用户能够更好地应用这些知识到实际项目中。</think>在硬件辅助虚拟化技术中,不同厂商的IOMMU/SMMU(输入输出内存管理单元)确实存在类似Intel **Root Table(根表)****Context Table(上下文表)**的概念,但其具体实现命名可能因架构而异。以下是分层对比解析: --- ### 一、Intel VT-d 的 Root Table 与 Context Table #### 1. **Root Table(根表)** - **作用**: - 作为**全局入口**,管理所有设备域(Domain)的上下文表地址。 - 每个PCIe设备通过其**Bus/Device/Function(BDF)**索引到对应的Context Table。 - **硬件支持**: - 由VT-d硬件直接读取,通常驻留在内存中,通过`RTADDR_REG`寄存器指定其物理地址。 - **典型场景**: - 系统启动时由Hypervisor初始化,为每个物理设备分配独立的地址翻译域。 #### 2. **Context Table(上下文表)** - **作用**: - 存储**具体设备域(Domain)的地址翻译规则**,包括: - 页表根地址(类似于CPU页表的CR3寄存器)。 - 访问权限(读/写/执行控制)。 - 中断重映射表地址(可选)。 - **层级关系**: - 每个Context Table条目对应一个设备(或一组设备),指向其二级页表结构。 --- ### 二、其他架构的类似概念 #### 1. **AMD IOMMU(AMD-Vi)** - **Device Table(设备表)**: - 功能类似Intel的**Root Table**,通过PCIe设备的BDF索引到**Domain Table**。 - **Domain Table(域表)**: - 类似Intel的**Context Table**,存储域特定的地址翻译配置: - 页表基地址(GPA→HPA映射)。 - 设备访问权限(DMA权限控制)。 - **差异点**: - AMD使用更简化的两级结构(Device Table → Domain Table),而Intel为多级(Root Table → Context Table → 页表)。 #### 2. **ARM SMMU(System MMU)** - **Stream Table(流表)**: - 类似Intel的**Root Table**,通过设备ID(StreamID)映射到**Context Descriptor(上下文描述符)**。 - **Context Descriptor(上下文描述符)**: - 类似Intel的**Context Table**,包含: - 页表基地址(Stage 1/Stage 2翻译)。 - 内存属性(缓存策略、权限位)。 - **扩展功能**: - ARM SMMUv3支持多级流表分布式上下文描述符,灵活性高于Intel VT-d。 #### 3. **NVIDIA GPU虚拟化(vGPU)** - **Engine Context Table**: - 在GPU硬件中管理不同虚拟机的上下文状态,功能上类似于IOMMU的Context Table。 - **差异**: - 非通用IOMMU,专用于GPU计算资源的隔离与调度。 --- ### 三、功能对比表 | **厂商/架构** | **顶层表(Root Table类比)** | **域配置表(Context Table类比)** | **核心差异** | |---------------|-----------------------------|----------------------------------|--------------------------------------| | Intel VT-d | Root Table | Context Table | 严格的两级结构,支持中断重映射 | | AMD IOMMU | Device Table | Domain Table | 简化层级,支持热插拔设备动态绑定 | | ARM SMMU | Stream Table | Context Descriptor | 支持多级流表,灵活适配异构设备 | | PCIe PASID | PASID Table | Process Address Space | 基于进程标识(PASID)的细粒度隔离 | --- ### 四、技术本质 1. **共性目标**: - **地址翻译**:将设备的DMA请求从Guest物理地址(GPA)转换为Host物理地址(HPA)。 - **权限隔离**:防止恶意设备通过DMA攻击其他虚拟机或宿主机内存。 - **性能优化**:减少虚拟化开销,实现接近物理设备的I/O性能。 2. **实现差异**: - **层级深度**:Intel/AMD采用固定两级,ARM支持可扩展多级。 - **灵活性**:ARM SMMU的Stream Table支持通配符匹配,适配复杂设备拓扑。 - **扩展性**:PCIe PASID标准允许单设备多上下文(如SR-IOV VF的进一步细分)。 --- ### 五、实际应用示例 #### 1. **KVM/QEMU中的VFIO直通** - **Intel**: ```bash # 启用VT-d并绑定设备到vfio-pci驱动 echo 1 > /sys/class/vtcmu/device/enable ``` - **ARM**: ```bash # 配置SMMU StreamID与虚拟机映射 devicetree节点:smmuv3@... { stream-id-map = <0x0 0x100>; }; ``` #### 2. **安全加固** - 通过Context Table限制设备DMA范围: ```c // 伪代码:设置Domain页表仅允许访问0x1000~0x1FFF context_entry->addr_width = 20; // 1MB地址空间 context_entry->root_ptr = &domain_pgtbl; ``` --- ### 六、总结 - **Intel的Root/Context Table**是IOMMU地址翻译的核心数据结构,其他架构通过**功能等价但命名不同**的机制实现类似目标。 - 开发者需关注: - **硬件差异**:不同厂商的表结构初始化流程可能不同(如ARM SMMU需配置StreamID到Context的映射)。 - **虚拟化协作**:Hypervisor(如KVM、Xen)需与硬件表结构协同,确保设备直通的安全性与性能。 - **调试工具**: - Intel:`intel_iommu=on`内核参数 + DMAR日志。 - ARM:SMMU内核调试选项(`CONFIG_ARM_SMMU_DEBUG`)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值