context switch的切换
操作系统中可能存在多个任务, 内核调度器周期性地将执行从一项任务转移到另一项任务。在这个过程中,操作系统会保存上一个进程的执行状态,然后恢复下一个进程的执行状态,这个过程称为context switch, 那么context switch的过程中,都保存和恢复了哪些东西呢,如下所示:
- general-purpose registers X0-X30.
- Advanced SIMD and Floating-point registers V0 - V31.
- Some status registers.
- TTBR0\_EL1 and TTBR0.
- Thread Process ID (TPIDxxx) Registers.
- Address Space ID (ASID).
ASID的介绍
现代操作系统的所有应用程序似乎都从同一地址区域运,这就是我们所说的用户空间。在实践中,不同的应用程序需要不同的MMU映射。例如,每一个应用程序都有 VA0x8000
地址,需要使用各自对应的页表进行转换.
理想情况下,我们希望不同应用程序的翻译都能够存储在TLB,而又希望在上下文切换时无需invalid TLB。但是处理器如何知道目前TLB存储的 VA0x8000
是哪个进程的呢?在 Armv8‑A 中,答案就是使用ASID进行标识。
那么对于TLB条目中,缓存的ASID到底是来自TTBR0还是来自TTBR1呢,由TCR寄存器的配置决定:
对于 EL0/EL1 虚拟地址空间,Page Descriptor属性字段中的 nG 位将转换标记为Gloabl(G) 或non-Gloabl(nG)。例如,内核映射是Gloabl(G)翻译,应用程序映射是non-Gloabl翻译。Gloabl翻译适用于当前正在运的任何应用程序。非全局翻译仅适用于特定应用程序
non-Gloabl映射在 TLB 中使用 ASID进行标记。在 TLB 查找时,将 TLB 条目中的 ASID 与当前选择的 ASID 进行比较。如果它们不匹配,则不使用TLB 条目。下图显示了内核空间中没有 ASID 标记的全局映射和用户空间中具有 ASID 标记的非全局映射
TLB Entry里都有什么?
以cortex-A710为例,TLB Entry( L1 data TLB returned data
)里都有什么?
Linux Kernel代码导读
TTBR0_EL1 和 ASID 的切换
作者:baron
文章来源:ARM精选
推荐阅读
- 思考:Linux Kernel的中断处理函数中是否会被其它程序(中断/异常)打断?
- SMMU学习这一篇就够了(软件硬件原理/模型导读)
- ARMV8的The current Program Counter (PC)介绍
欢迎关注ARM精选专栏, 欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。