【问题标题】:Why not to double number of registers for fast syscalls?为什么不将快速系统调用的寄存器数量加倍?
【发布时间】:2015-07-10 11:42:29
【问题描述】:
我们面临两个事实:
1. 系统调用很昂贵。程序应将其状态保存在堆栈上,陷阱到内核,这会导致缓存和TLB失效等。
2. 借助新技术(如 14nm),我们有足够的芯片空间。
为什么不拥有两组寄存器和两个 TLB?一个用于用户空间进程,另一个用于内核。每个系统调用只会将处理器从用户空间寄存器 + tlb 切换到内核,这应该非常快。
显然我在这里遗漏了一些东西。
【问题讨论】:
标签:
operating-system
cpu-architecture
【解决方案1】:
一些处理器架构有影子寄存器。例如,Z80 在中断时切换到备用寄存器文件。限制寄存器文件大小的因素之一是时钟周期。如果重命名表变得太大,那会减慢前端的流水线阶段。
TLB 通常具有很高的命中率,因为每个条目对应于整个页面,并且它们通常可以标记多个地址空间的条目。第一次系统调用的 TLB 未命中开销可能很高,但如果您进行大量系统调用,您的 TLB 可能会保留内核内存的映射。
【解决方案2】:
寄存器用于在系统调用中交换值。有些系统有内核模式栈,所以栈不能用来交换值。