查看“TLB”的源代码
←
TLB
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
'''Translation Lookaside Buffer''' ('''TLB''') 是一种内存页面转换的缓存,它在许多具有内存分页功能的系统中使用。 当处理器需要将给定的虚拟地址转换为物理地址时,首先要查询TLB。 在x86系统上,TLB未命中会由硬件透明处理。 仅当页面目录(page directory)/表条目(table entry)不存在于核心中时,才会通过页面错误异常通知操作系统。 == 使用含义 == 像常规的CPU缓存一样,TLB “几乎是” 透明的。 操作系统必须注意两种情况。 === 修改分页结构 === TLB没有透明地告知对分页结构所做的更改。 因此,一旦发生这种变化,就必须刷新TLB。 在x86系统上,这可以通过写入页面目录基寄存器 (CR3) 来完成: <source lang="asm"> movl %cr3,%eax movl %eax,%cr3 </source> 注意: 在页面目录/表条目中设置全局 (G) 位,将会阻止该条目被刷新。 这对于将中断处理程序固定到位很有用。 一种更好的刷新TLB的替代方法是使用 <code>invlpg</code> 指令,在进行小的映射修改 (创建,删除,更改) 时,应使用该指令代替上述方法。) <code>invlpg</code> 主要用于页面取消映射和重新映射例程中,以使先前的缓存转换无效。 如果未使用 <code>invlpg</code> 或其他TLB 刷新方法,则映射将保持缓存状态,从而产生不确定的后果。 但是,请注意,<code>invlpg</code> 指令是在i486 ISA中引入的,并且不是i386 ISA的一部分,因此i386-compatible内核在编译时需要根据目标计算机正确使用相关条件包含代码。 示例过程声明和源代码如下: <source lang="c"> void vm_page_inval(void *); </source> <source lang="asm"> #include <kconfig.h> .globl vm_page_inval vm_page_inval: #if TARGET_MACHINE >= TARGET_MACHINE_I486 movl 4(%esp),%eax invlpg (%eax) #else /* TARGET_MACHINE < TARGET_MACHINE_I486 */ movl %cr3,%eax movl %eax,%cr3 #endif ret </source> 请注意,仅在进程地址空间之间切换时才需要更改或重新加载CR3。 在大多数情况下,使用它来完全刷新TLB确实是相当不必要的。 === 多处理器一致性 === 以上在多处理器的情况下更为复杂。 如果另一个处理器也可能受到页表写入的影响 (由于共享内存或来自同一进程的多个线程),则还必须刷新这些处理器上的TLB。 这将需要某种形式的处理器间通信。 == 另见 == === 外部链接 === * [http://en.wikipedia.org/wiki/Translation_lookaside_buffer The Wikipedia TLB article] [[Category:X86]]
返回至“
TLB
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
变体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息