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

标签 x86 operating-system paging virtual-memory 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?

如果操作系统内存不足,它会想要释放一些页面(例如,将页面的数据发送到交换空间,以便它可以将物理内存用于其他用途)。通常,这将基于“最近最少使用”,但 CPU 每个页面只有 1 个“已访问”标志,因此要解决此问题,操作系统会定期检查已访问标志并将其清除回零,以便它(大致)知道页面被访问了多久,而不仅仅是它是否被访问/未被访问。它有点像“if(page->accessFlag == 1) { page->accessFlag = 0; page->time_since_access = 0; } else { page->time_since_access++; }”。

对于脏标志,请考虑读/写内存映射文件或回写磁盘缓存。程序修改内存中的数据(导致设置脏标志);然后,当磁盘驱动器无事可做时,操作系统可能会找到设置了脏标志的页面,将它们写入磁盘,并将脏标志清除为零(因此同一页面不会再次写入磁盘)下次就没有理由了)。

How does the Dirty and Access bits affect the TLB?

情况恰恰相反 - TLB 影响标志(并且标志不影响 TLB)。

当CPU设置脏或访问标志时,它会对内存进行原子更新以防止竞争条件(例如其他CPU同时修改或检查相同的页表条目),并且原子更新有点昂贵。为了减少/避免这些原子写入,CPU 可以(并且很可能会)将页面的已访问标志和脏标志缓存在 TLB 条目中,以便在 CPU 想要设置标志但 TLB 条目显示时可以跳过原子写入无论如何,它们已经设置好了。如果 TLB 条目错误(例如,因为操作系统更改了内存中的已访问或脏标志,但没有使 TLB 条目无效),则 CPU 可以跳过操作系统所需的原子写入。这可能会导致数据损坏(例如,操作系统假设内存中页面的内容不需要写入磁盘,因为未设置脏标志)。

关于x86 - 脏位和访问位如何影响 TLB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71583800/

相关文章:

python - python 中线程特定的 os.chdir 和 mkdir 是什么?

operating-system - 页面框架号与页面表条目

c++ - Qt 5.1 使用 QSerialPort 进行串口通信

c - 使用 Assembly 在 C 中添加

linux - 中断发生时,或者进程调度时,是否需要保存标志寄存器?

assembly - JMP 对堆栈和帧指针执行什么操作?

c - 什么是 C 中的 pragma align?

c - 如何更精确地衡量上下文切换的成本

php - 每次加载时自动执行搜索查询,无需点击搜索按钮

sql-server - SQL Server 进程内存的很大一部分已被调出