gpt4 book ai didi

arm - ARM 中 TPIDR_EL0/TPIDR_EL1 等线程 ID 寄存器的用途是什么?

转载 作者:行者123 更新时间:2023-12-04 12:32:02 64 4
gpt4 key购买 nike

根据 ARM documentation , 线程 ID 注册为 TPIDR_EL0TPIDR_EL1 ,

Provide locations to store the IDs of software threads and processesfor OS management purposes. These registers have no effect onprocessor behavior.


为什么有人要将线程 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 中。

最佳答案

与用户空间中线程本地存储相关的所有内容都需要保存在每线程结构中。您需要将这个结构的地址保存在某处。在 armv8 中,TPIDR_EL0可用于此目的。在 x86_64 中,通常是 fs段寄存器被重新用于此用途。
紫红色的ABI for Thread-Local Storage记录在他们的网站上。
在紫红色中,TPIDR_EL0将为您提供 pthread structure .见 __allocate_thread 关于如何分配一些内存。
一个使用示例(线程局部变量除外)是 SafeStack feature ,它将第二个堆栈指针存储在 pthread 结构中。
对于内核,在 armv8 中,TPIDR_EL1用于类似目的,用于保存内核指针 Thread structure .
请注意,在 armv8 中,有一个 EL0 的寄存器(用户空间)和 EL1 (内核空间)。在 x86-64 中,没有分离,处理有点尴尬:内核有一个内部位置来存储 gs 寄存器的“内核版本”,并使用 swapgs在用户空间和内核空间 gs 寄存器之间切换的指令。

关于arm - ARM 中 TPIDR_EL0/TPIDR_EL1 等线程 ID 寄存器的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64856566/

64 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com