我有一个关于SMP系统的问题,其中多个线程属于同一进程:
所有这些线程共享一个页面树,并且树中pte的访问和脏位是自动(读取-修改-写操作)更新(访问&根据pte缓存被冲回时的数据?
或者有多达数量的线程重复页表,每个页表在运行时专用于单个线程(如果另一个线程正在运行则回收),以便在刷新pte缓存时更新访问位和脏位时不需要(rmw-)锁定保存pte条目的内存。
同一进程的每个线程都有相同的CR3页表。
对PTE A和D位的更新是原子的,可能是由微码作为一种原子或操作来完成的。(IIRC,大多数现代x86 cpu处理设置A或D位作为加载或存储指令的微码辅助,需要设置TLB项中尚未设置的位。)
x86在设置页脏位时是如何提示的?引用了英特尔和AMD关于"自动锁定"的手册。如LOCK前缀。
与操作系统必须为每个HW线程(也称为逻辑核心)维护每个进程的页表副本(或者为进程的每个软件线程,如果这是一个较小的数字)相比,更新时的原子RMW相对便宜。它已经是一个缓慢的微码辅助,让CPU设置一点。此外,您也不希望N个页表副本浪费L3缓存空间。