缓存中使用虚拟寻址的设计问题

摘要自:Unix Systems for Modern Architectures – Symmetric Multiprocessing and Caching for Kernel Programmers by Curt Schimmel: Chapter 3 “Virtual Caches”

虚拟寻址缓存根据指令或者数据的虚拟地址作为索引 (index) 和标记 (tag)。这在一定程度上让操作系统的设计变得复杂,因为不同进程可以有相同的虚拟地址。如果设计出错,一个进程缓存的数据可以被另一个进程读取,导致错误。为阻止这种情况发生,操作系统必须在此之前将缓存清空。本章介绍虚拟寻址缓存的各种操作,歧义、重名是如何发生的,以及操作系统如何才能组织这类错误对程序正确运行的影响。本章只考虑单核CPU的情况。

使用虚拟寻址缓存的系统中,如果缓存命中(cache hit),对数据的读操作可以通过MMU,也可以不同过MMU。比如,Intel i860 系列,在取指令阶段,如果缓存命中,MMU不会翻译虚拟地址。这意味着硬件不会对这次读操作执行权限的验证。这种情况也存在于Apollo DN4000 以及 Sun 3/200 中。在这类系统中,MMU 仅仅对缓存未命中的虚拟地址执行翻译以及权限验证操作。这里隐含着一个默认的假设,即如果一个程序在缓存未命中时有权限访问某一数据,那么他在后续的运行中如果发生缓存命中,它仍然有权限访问这个数据。操作系统必须保证在程序权限注销后,缓存的数据也标记失效(invalidated).

在写回类型的缓存中,验证一个请求的访问权限较(直写类型)复杂一点。假设缓存支持写分配(write-allocate),因为这是写回缓存的通常做法,那么一个未命中的写请求会调用MMU去翻译地址并检查权限。权限通过则载入缓存,并设置修改位为1。如果缓存架构中没有写分配,则一个未命中的写请求的处理过程同直写类型的缓存一样:数据只被写入内存中,缓存内容保持不变。

如果在写回缓存中,写请求的地址在缓存中命中,而且该地址在缓存中被标记为已修改,则我们可以默认其修改权限为合法的。因为我们可以比较安全的假设之前修改此地址内容时该进程已经有了写权限。

但是,如果写请求的地址在缓存中命中,而且该地址并没有被标记为已修改,则我们就无法从缓存中推断该进程对该地址到底有没有写权限。这时,就需要调用MMU来进行权限检查。这是Intel i860 XR的缓存设计所采取的方法。

而在Apollo DN4000 的写回缓存中,增加了一个可写权限位,从而避免了在更新缓存过程中要调用MMU验证权限的过程。缓存中的可写权限位是在内存页表中写权限位的一个副本。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值