根据ARM文档,线程ID注册为TPIDR_EL0
或TPIDR_EL1
,
为操作系统管理目的提供存储软件线程和进程ID的位置。这些寄存器对处理器行为没有影响。
为什么有人要将线程ID存储在一个特殊的寄存器中?ARM处理器是否需要线程像MMU那样在内存中有特殊的结构?丝线是什么特别的武器,什么手臂期待找到什么地方?或者我可以不使用这个寄存器就实现线程(有效)吗?
我之所以问这个问题,是因为我在Fuchsia操作系统的Zircon内核上找到了以下代码:
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
中。
发布于 2021-01-18 08:55:33
与用户空间中的线程本地存储相关的所有内容都需要保持在每线程结构中。你需要把这个结构的地址保存在某个地方。在armv8中,TPIDR_EL0
可用于此目的。在x86_64中,通常对fs
段寄存器进行重新使用。
紫红色的用于线程的ABI -本地存储被记录在他们的网站上。
在紫红色,TPIDR_EL0
会给你线程结构。有关如何分配这些内存,请参见__allocate_thread
。
一个使用示例(线程局部变量除外)是SafeStack特征,它将第二个堆栈指针存储在p线程结构中。
对于内核,在armv8中,为了类似的目的,使用TPIDR_EL1
来保存内核螺纹结构的指针。
注意,在armv8中,有一个EL0
(用户空间)和EL1
(内核空间)的寄存器。在x86-64中,没有分离,处理也有点尴尬:内核有一个内部位置来存储gs寄存器的“内核版本”,并使用swapgs
指令在用户空间和内核空间gs寄存器之间进行更改。
https://stackoverflow.com/questions/64856566
复制相似问题