地址转换--TLB缓存一致性

TLB缓存的一致性由软件(内核)提供保证,不是硬件。
TLB缓存是对页表项的缓存
如何保证页表项跟TLB缓存之间的一致性?
对页表项的修改情形分类

  • 整个页表项失效
    比如,当发生进程间切换时,对于新进程来说,旧进程的所有虚拟地址都失效了,即相应的页表项和TLB缓存条目都失效,如果不做相应的清理工作,则新进程就可以读取就进程的数据结构,要么导致旧进程崩溃,要么窃取旧进程的敏感信息。
    系统一般的做法是:
    首先,修改页表寄存器使其指向新的进程;
    其次,要么清空所有TLB条目,要么在原TLB条目中添加进程id信息
tagged TLB entry = { process ID, virtual page number, physical page frame number, access permissions }

【地址转换--TLB缓存一致性】注意:(1)这里不需要修改硬件多级页表里存储的旧进程的页表项;
(2)新进程和老进程可能使用了相同的虚拟地址
  • 权限修改
    -- 权限增强
    当内核增强需要增强一个页的权限时,首先中断相应进程,保证TLB中没有旧的地址转换的结果。如果这个页是共享的,则要保证TLB中没有任何一个引用该页的进程id的拷贝。比如,将一块内存区域标记为copy-on-write,系统需要将这块内存区域从可读可写降级为只读,需要移除所有引用该内存区域的进程id的拷贝,因为引用该内存区域的旧TLB条目可能还是可读可写权限。
    -- 权限降级
    什么都不用做,比如:页表项由invalid变成valid(动态增长堆栈时,需要分配物理内存和修改invalid页表项指向新的物理内存),页表项从只读变成可读可写等
多处理器情形下的TLB一致性
对于多处理器来说,每个处理器上的TLB里都可能存在同一个进程的地址转换结果拷贝。只要有页表项发生修改,则在修改生效前,每个处理器上的TLB里相应的拷贝都要被丢弃。具体地讲,当前处理器可以立即使其TLB失效,移除其他处理器上的条目需要操作系统中断其他处理器,请求移除该拷贝。

    推荐阅读