【发布时间】:2013-01-17 22:00:13
【问题描述】:
我对@987654321@ 手册页中的措辞感到困惑。具体来说,它指出:
64 位段库的上下文切换相当昂贵。它可能 是使用段选择器设置 32 位基数的更快替代方案 通过使用 modify_ldt(2) 或使用 set_thread_area(2) 设置 LDT 内核 2.5 或更高版本中的系统调用。 arch_prctl() 仅在以下情况下才需要 您想设置大于 4GB 的基数。记忆在第一 使用 mmap(2) 可以分配 2GB 的地址空间 MAP_32BIT 标志。
这是否意味着使用此系统调用的进程的上下文切换会受到性能损失或确切的影响是什么?
查看 Linux 内核的源代码后,似乎对于小于 4 GiB 的地址使用 LDT,而大于 4 GiB 的地址使用特定于模型的寄存器。
case ARCH_SET_FS:
/* handle small bases via the GDT because that's faster to
switch. */
if (addr <= 0xffffffff) {
set_32bit_tls(task, FS_TLS, addr);
if (doit) {
load_TLS(&task->thread, cpu);
loadsegment(fs, FS_TLS_SEL);
}
task->thread.fsindex = FS_TLS_SEL;
task->thread.fs = 0;
} else {
task->thread.fsindex = 0;
task->thread.fs = addr;
if (doit) {
/* set the selector to 0 to not confuse
__switch_to */
loadsegment(fs, 0);
ret = wrmsrl_safe(MSR_FS_BASE, addr);
}
}
put_cpu();
break;
如何使用 GDT 比写入寄存器更快?另外,我假设更新FS和GS的价格只在进程之间切换时支付,这意味着当没有其他进程计划运行时,通过系统调用进入内核没有额外费用?
【问题讨论】:
标签: c linux performance x86-64 cpu-registers