ASID概念
现代CPU发起的访问最初都是虚拟地址VA,而真正从物理主存中获取内容需给内存控制器的地址是物理地址PA,所以在CPU发起访问后,需要一系列的动作完成VA到PA的转换,这需要OS和硬件MMU协同来完成。
简要过程如下:VA以页表大小取余,得到PA的低位,关键是PA的高位(PFN)如何得到。内存中存放着页表,页表记录的是VPN到PFN的对应关系(一般可能会分为多级页表),以VPN查询页表即可获得PFN。为了加速这个查询,引入了TLB,TLB记录的是一个内存页表的一个子集,相当于是内存页表的缓存。所以MMU在以VPN索引先在TLB中查找页表,如果查询TLB miss则会产生异常,由异常处理程序进行地址转换。系统中如果有多个进程,他们访问同样的虚拟地址VA的话,他们的页表缓存对应TLB中同一条目,如果进程切换需要刷新TLB,为了降低进程切换的成本引入ASID(Addrss Space ID)地址空间,OS为每个进程分配各自的ASID(存储在mm_struct.context.id中,这样TLB中可以同时缓存多个进程的页表,进程切换的时候不需要刷TLB了。啧啧 又一个空间换时间的案例。
参考:
https://blog.csdn.net/kklvsports/article/details/22999891
https://zhuanlan.zhihu.com/p/118244515
https://developer.arm.com/documentation/den0013/d/The-Memory-Management-Unit/Multi-tasking-and-OS-usage-of-translation-tables/Address-Space-ID