background
在Linux中,进程操作的都是虚拟地址,而MMU是进行虚拟地址与物理地址的转化,TLB用于加快虚拟地址(线性地址)的转换~ 每个进程都有自己对应的页表,不同进程相同的虚拟地址映射的大概率不是相同的物理地址,同时不同进程不同的虚拟地址可能映射到相同的物理地址上。本文的疑问就是针对进程有不同的页表,那么MMU与TLB到底是怎么根据虚拟地址找到物理地址的呢,是不是MMU和TLB需要知道进程的信息呢,带着这些疑问来进行探究~
疑问1 MMU、TLB是否需要知道进程信息?
转换后援缓冲器TLB(Translation Lookaside Buffer)的高速缓存用于加快线性地址的转换。当一个线性地址被第一次使用时,通过慢速访问RAM中的页表计算出相应的物理地址。同时物理地址被存放在一个TLB表项(TLB entry)中,以便以后对同一线性地址的引用可以快速得到转换。
在多处理系统中,每个CPU都有自己的TLB,这叫做该CPU的本地TLB。与硬件高速缓存相反,TLB中的对应项不必同步,这是因为运行在现有CPU上的进程可以使用同一线性地址与不同的物理地址发生联系。
当CPU的cr3控制寄存器被修改时,硬件自动使本地TLB中的所有项都无效,这是因为新的一组页表被启用而TLB指向的是旧数据。
每个进程都有自己的页表,页表的起始地址放在进程的进程控制块(PCB)中,当某进程运行时,将其页表的起始地址放在页表寄存器(cr3)中。单CPU系统中只能有一个进程处于执行状态,因此一个页表寄存器可供系统中所有的进程交替使用。
CR3中含有页目录表物理内存基地址,因此该寄存器也被称为页目录基地址寄存器PDBR(Page-Directory Base address Register)
操作系统和MMU是这样配合的:
1、操作系统在初始化或分配、释放内存时会执行一些指令在物理内存中填写页表,设置CR3寄存器,MMU通过CR3寄存器获得页表在物理内存中的位置。
2、设置好之后,CPU每次执行访问内存的指令都会自动引发MMU做查表和地址转换操作,地址转换操作由硬件自动完成,不需要用指令控制MMU去做。
总结
通过上述分析,其实MMU、TLB是需要知道进程的具体信息的,进程切换之后TLB的内容都会无效,它只缓存当前运行进程的地址转换,当进程切换时,CR3寄存器内容修改,TLB中的内容自动失效~ 。MMU也是通过CR3寄存器中的页目录表物理内存基地址去找到当前正在运行进程的页表,所以MMU也不太需要具体的进程信息~
参考
[1] 深入理解Linux内核
[2] MMU内存管理单元
疑问2 多处理器是否会发生相应的虚拟地址冲突?
每个处理器应该都有自己的CR3控制寄存器,多处理器多进程在同时运行时,根据自己的CR3寄存器找到对应的页表即可。
总结
不存在冲突
疑问3 cpu cache是否需要知道进程信息?
在解答这个之前,需要先了解cache的组织方式,如何通过虚拟地址或物理地址来寻找cache。
cache主要有三种组织方式:
-
VIVT(Virtual Index Virtual Tag):使用虚拟地址做index,虚拟地址做Tag;
-
VIPT(Virtual Index Physical Tag):使用虚拟地址做index,物理地址做Tag;
-
PIPT(Physical Index Physical Tag):使用物理地址做index,物理地址做Tag;
具体内容可以查阅博文《Cache组织方式》地址:https://zhuanlan.zhihu.com/p/107096130?tdsourcetag=s_pctim_aiomsg
对于cache的三种组织方式在进行虚拟地址到物理地址的转换时,都是基于CR3来进行的,CR3有当前运行进程的相关信息,在《深入理解LINUX内核》一书中 P63 指出CR3寄存器中存放的是进程描述符(task_struct),如果是存放的这个那么MMU、TLB既然能读取CR3的内容,那么也是能够知道进程的相关信息的,但是有的由把CR3寄存器称为页目录基地址寄存器PDBR,如果CR3中只保存了页目录基地址,那么MMU和TLB是不知道具体的进程信息的~
4、其他内容
(1)关于TLB miss可以参考《TLB缓存是个神马鬼,如何查看TLB miss?》
地址:https://blog.csdn.net/zhangyanfei01/article/details/100053533
(2)页表和页目录在内容中的存放可以参考《关于进程页表和页目录是存放在内核空间,还是用户空间,低端还是高端内存的思考和验证》
地址:https://blog.csdn.net/u011673554/article/details/48262045
(3)cache的一些基础知识可以参考《Cache是怎么组织和工作的?》
地址:https://zhuanlan.zhihu.com/p/31859105
5、下一步
接下来需要进一步了解CR3的具体内容,以及MMU和TLB还有操作系统与CR3的交互方式~
https://blog.csdn.net/SweeNeil/article/details/106171361

本文探讨了在Linux中,MMU和TLB如何根据虚拟地址找到物理地址,以及它们是否需要知道进程信息。在多处理器系统中,每个CPU的CR3寄存器确保了地址转换的正确性,避免冲突。CPU Cache的组织方式,如VIPT,依赖CR3进行地址转换,可能需要或不需要进程信息。
2042

被折叠的 条评论
为什么被折叠?



