脏位和访问位如何影响 TLB?

How does the Dirty and Access bits affect the TLB?

我了解到,如果一个页面已被访问,它的访问位将被设置,如果已被写入,脏位也将被设置。但我不清楚这些位如何影响 TLB/TLB 缓存?还有OSDEV有下面一段

When changing the accessed or dirty bits from 1 to 0 while an entry is marked as present, it's recommended to invalidate the associated page. Otherwise, the processor may not set those bits upon subsequent read/writes due to TLB caching.

在什么情况下您会将脏位和访问位从 1 更改为 0?

In what cases would you change the dirty and access bits from 1 to 0?

如果 OS 运行 内存不足,它会想要释放一些页面(例如,将页面数据发送到交换区 space 以便它可以使用物理内存其他东西)。通常这将基于“最近最少使用”,但 CPU 每个页面只有 1 个“访问”标志,因此要解决 OS 定期检查访问标志并将其清除的问题为零,这样它就可以(大致)知道一个页面在多长时间前被访问过,而不仅仅是 was/wasn 是否未被访问过。有点像“if(page->accessFlag == 1) { page->accessFlag = 0; page->time_since_access = 0; } else { page->time_since_access++; }”。

对于脏标志,考虑read/write 内存映射文件,或write-back 磁盘缓存。某个程序修改了内存中的数据(导致脏标志被设置);然后当磁盘驱动器无事可做时,OS 可能会找到设置了脏标志的页面,将它们写入磁盘,并将脏 flag/s 清除回零(因此同一页面不会下次无缘无故再次写入磁盘)。

How does the Dirty and Access bits affect the TLB?

恰恰相反——TLB 影响标志(而标志不影响 TLB)。

当 CPU 设置脏或访问标志时,它会对内存进行原子更新以防止竞争条件(例如其他 CPU 修改或检查同一页面 table同时进入),原子更新有点昂贵。对于 reduce/avoid 这些原子写入 CPU 可以(并且很可能会)在 TLB 条目中缓存页面的访问标志和脏标志,以便如果 CPU 想要跳过原子写入设置 flag/s 但 TLB 条目说它们已经设置好了。如果 TLB 条目错误(例如,因为 OS 更改了内存中的访问标志或脏标志但没有使 TLB 条目无效),那么 CPU 可以跳过 OS。这可能会导致数据损坏(例如 OS 假设内存中的页面内容不需要写入磁盘,因为未设置脏标志)。