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