JJJ:arm64架构下的asid相关

文章目录

ASID

ASID(Address Space Identifier,地址空间标识符)用于区分不同的虚拟地址空间,确保每个进程的页表项是唯一的。

现代操作系统允许多个进程并发运行,每个进程都有自己的虚拟地址空间。为了高效地管理这些地址空间,ARM64 架构引入了 ASID 来唯一标识每个进程的页表。

TLB(Translation Lookaside Buffer)是加速虚拟地址到物理地址转换的一种硬件缓存,可以把它理解成一种快速页表。

TLB中的每一个条目,不仅包含虚拟地址和物理地址之间的映射,还包括 ASID。只有当虚拟地址和 ASID 都匹配时,才能找到对应的物理地址。

操作系统为每个进程分配一个唯一的 ASID。通常,ASID 是在一个范围内循环使用的,以确保不会耗尽可用的 ASID。

当进程切换时,操作系统会更新 TTBR0_EL1 和 TTBR1_EL1 寄存器中的 ASID 字段。如果新进程的 ASID 与旧进程不同,则 TLB 中的现有条目仍然有效;如果相同,则需要刷新 TLB(不然真的会访问到错误的物理地址)。如此可以减少不必要的TLB刷新次数

TTBR0_EL1:用于用户空间页表基址。

TTBR1_EL1:用于内核空间页表基址。

ASID版本号

实际使用的 ASID 可以看作是由两部分组成的:一部分是传统的 ASID,另一部分是版本号。

当一个新的进程创建时,操作系统会为它分配一个新的 ASID 和初始版本号(通常是 0)。

当 ASID 资源快耗尽时,操作系统可以通过增加版本号来重新利用旧的 ASID。每次 ASID 回收并重新分配时,版本号都会递增。

当版本号发生变化时,操作系统需要刷新 TLB,以确保所有旧的、不匹配的条目都被清除。这可以通过执行 TLB 无效化指令(如 TLBI 指令)来完成。

在 TLB 查找过程中,CPU 不仅会检查虚拟地址和 ASID,还会检查版本号。只有当三者都匹配时,TLB 条目才会被认为是有效的。

举例

参考:地址空间标识符ASID

寄存器TTBR0_EL1(转换表基准寄存器0)或TTBR1_EL1(转换表基准寄存器1)都可以用来存放ASID。

寄存器TCR_EL1的A1位决定使用哪个寄存器存放当前进程的ASID。

通常使用TTBR0_EL1寄存器TTBR0_EL1的位[63:48]存放当前ASID,[47:1]存放当前进程的页全局目录物理地址(如果是8位,[63:56]是保留位;)

以ASID为8位长度叙述

ASID只有256个值,其中0是保留值;进程数量超过255,两个ASID可能相同,内核引入版本号,解决。具体步骤如下:

1)每个进程有64位软件ASID,低8位存放硬件ASID,高56位存放ASID版本号;

2)64位全局变量asid_generation的高56位保存全局ASID版本号;

3)当进程被调度时,比较进程ASID版本号和全局ASID版本号,如果版本号相同,那么直接使用上次分配的硬件ASID,否则重新给进程分配硬件ASID。如果存在空闲的硬件ASID,那么选择一个分配给进程;如果没有空闲的硬件ASID,把全局ASID版本号加1,重新从1开始分配硬件ASIDA.因为刚分配的ASID可能和某个进程的硬件ASID相同,只是ASID版本号不同,页表缓存可能包含了这个进程的页表项,所以必须把所有处理器的页表缓存清空。

引入版本号好处:避免每次进程切换都需要清空页表缓存,只需要在硬件ASID回滚时,把处理器的页表缓存清空。

处理器给进程分配ASID时,如果ASID分配完了,那么把全局ASID加1,重新从1开始分配ASID,针对每个处理器,使用该处理器的reserved_asids保存该处理器正在执行的进程的ASID,并且把该处理器的active_asids设置0。active_asids为0 具有特殊意义,说明全局ASID版本号变化,ASID从255回到1

相关推荐
链上Sniper12 分钟前
高并发区块链系统实战:从架构设计到性能优化
开发语言·网络·python·性能优化·架构·区块链·php
链上Sniper44 分钟前
NFT 市场开发:基于 Ethereum 和 IPFS 构建去中心化平台
开发语言·网络·架构·去中心化·区块链·php
链上Sniper1 小时前
区块链跨链通信:使用 Cosmos SDK 实现链间互操作
开发语言·网络·架构·区块链·php
gs801402 小时前
12306高并发计算架构揭秘:Apache Geode 客户端接入与实践
架构·apache
GISer_Jing4 小时前
Monorepo 详解:现代前端工程的架构革命
前端·javascript·架构
白总Server5 小时前
Golang 依赖注入:构建松耦合架构的关键技术
linux·运维·服务器·macos·架构·golang·xcode
慌糖8 小时前
由docker引入架构简单展开说说技术栈学习之路
docker·容器·架构
XMAIPC_Robot12 小时前
基于 ZYNQ UltraScale+ OV5640的高速图像传输系统设计,支持国产替代
linux·数码相机·fpga开发·架构·边缘计算
weixin_3077791312 小时前
Neo4j 数据可视化与洞察获取:原理、技术与实践指南
信息可视化·架构·数据分析·neo4j·etl
问道飞鱼13 小时前
【分布式技术】KeepAlived高可用架构科普
分布式·架构·keepalived·高可用