我知道在x86架构中,我可以在内核上下文中读取CR3寄存器 跟随内核的页目录。
现在我正在尝试使用 SPARC 架构在 Linux 上做同样的工作。 如何访问 SPARC 中内核的页目录?
x86 CR3在SPARC中对应的寄存器是什么?
他们的分页机制一样吗?
ps。 ARM 怎么样?,我有一些关于这些的文档,但我需要更多...... 提前谢谢你。
在 SPARC TLB 上,故障是由软件处理的,因此没有像 CR3 这样的东西。您必须检查当前的流程数据结构才能找到所需的信息。
另一方面,ARM 使用硬件转换,MMU 被视为协处理器,使用 MRC/MCR 来访问转换表基址寄存器。有关更多信息,请参阅 ARM 网站:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0056d/BABIDADG.html
SPARC 规范本身并不强制要求使用 MMU,也不要求 MMU 的特定实现;它仅仅定义了CPU和MMU之间的接口(主要关注需要通过MMU活动生成的陷阱)。
也就是说 - 我必须在这里声明,我只了解 Sun / Fujitsu 的 SPARC CPU,而不了解嵌入式产品(LEON 和前身) - SPARC CPU 早在 1990 年的
sun4
工作站 CPU 就有 MMU。
与许多非强制 SPARC CPU 功能一样,对 MMU 的控制通过所谓的 A地址 S速度 I标识符 (ASI) 进行。
这些 ASI 是 SPARC 架构的一项功能,最好将其描述为 x86 分段和内存映射寄存器之间的混合。它们的使用改变了“地址”对 SPARC CPU 的含义(就像 x86 中使用段 [reg] 改变了“地址”的含义一样)——除了 ASI 地址范围后面没有可配置的“描述符表” ,但通常是特定于硬件的控制寄存器。 IE。它们没有“映射”到普通的物理地址空间,而是映射到备用地址范围。
首先 - 在
sun4
、sun4c
、sun4d
和 sun4m
架构(32 位 sparcv7)中,MMU 称为 srmmu
(SPARC 参考 MMU)并实现了两级硬件表遍历。这已被弃用,我不记得这方面的控制规则是什么。
当 Sun 创建
sun4u
架构时,硬件实现的转换表遍历被认为开销过高且占用内存过多;因此,走表 MMU 实现被完全抛弃,转而支持在软件中实现“大多数”(但不是全部)MMU 功能。特别是,硬件中唯一可编程的是 TLB、转换后备缓冲区的内容 - 这意味着如果映射不容易缓存在 TLB 中,则会发生 MMU 未命中陷阱,并且陷阱处理程序将执行表查找、重新编程TLB 放在最后(这样之后重新发出指令就会成功)。这就是 sfmmu
(SoftwareMMU)这个名字的由来。 MMU 通过
ASI_MMU
进行控制,而实际的上下文寄存器是 CPU 特定的...参见,供参考:
ASI_MMU_CTX
。OpenSolaris 源代码,
sfmmu_asm.s
(小心眼睛流血,大脑变得糊状)OpenSolaris 源代码,
hat_sfmmu.c
这就是软件端哈希链/转换表遍历;它可能有幸成为 Solaris 内核中最大的源文件......
sun4 和 sun4c 架构(sparcv7 架构 CPU)使用外部“Sun4 MMU”,也称为“PMEG MMU”。这在架构上与下面的后来的 srmmu
非常sun4m 和 sun4d 架构(SuperSPARC、HyperSPARC、microSPARC、TurboSPARC CPU)具有片上“SPARC 参考 MMU”(srmmu)。反过来,这也与后来的 sfmmu 有很大不同(srmmu:硬件表遍历;sfmmu:软件表遍历,带有预先遍历的内存中二级 TLB 缓存,称为翻译存储缓冲区 -“TSB”) . sun4u(UltraSPARC-I/II/III/IV 系列 CPU、SPARC64-GP、SPARC64-V/VI/VII)具有片上“Spitfire MMU”(sfmmu),以原始 UltraSPARC-I CPU 命名,代号喷火式战斗机。
请注意,HAL 中的原始 SPARC64-I/-II/-III CPU 使用与上述所有 CPU 不同的 MMU 架构。