根据ARM文档,像
提供了存储软件线程和进程ID以进行操作系统管理的位置。这些寄存器对处理器行为没有影响。
为什么有人想要将线程ID存储在特殊寄存器中?ARM处理器是否需要像MMU一样在内存中拥有线程的特殊结构?对于ARM来说,线程是一种特殊的东西,ARM希望在某个地方找到它吗?或者我可以完全不使用这个寄存器来实现(高效的)线程?
我之所以问这个问题,是因为我在Fuchsia OS的Zircon Kernel中发现了这段代码:
TPIDR_EL0
或TPIDR_EL1
这样的线程ID寄存器,提供了存储软件线程和进程ID以进行操作系统管理的位置。这些寄存器对处理器行为没有影响。
为什么有人想要将线程ID存储在特殊寄存器中?ARM处理器是否需要像MMU一样在内存中拥有线程的特殊结构?对于ARM来说,线程是一种特殊的东西,ARM希望在某个地方找到它吗?或者我可以完全不使用这个寄存器来实现(高效的)线程?
我之所以问这个问题,是因为我在Fuchsia OS的Zircon Kernel中发现了这段代码:
static inline void arch_set_current_thread(Thread* t) {
__arm_wsr64("tpidr_el1", (uint64_t)&t->arch_.thread_pointer_location);
__isb(ARM_MB_SY);
}
系统启动时会创建一个线程,并将其指针存储在 tpidr_el1
中。
fs
或gs
寄存器,在 ARM 上为TPIDR_ELx
。每个 CPU 需要一块内存区域,因为内核代码被设计为在任何 CPU 上平等运行(因此代码相同但指针不同)。 - Margaret Bloom