首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在ARM中使用诸如TPIDR_EL0/TPIDR_EL1这样的线程ID寄存器的目的是什么?

在ARM中使用诸如TPIDR_EL0/TPIDR_EL1这样的线程ID寄存器的目的是什么?
EN

Stack Overflow用户
提问于 2020-11-16 10:46:32
回答 1查看 2.6K关注 0票数 4

根据ARM文档,线程ID注册为TPIDR_EL0TPIDR_EL1

为操作系统管理目的提供存储软件线程和进程ID的位置。这些寄存器对处理器行为没有影响。

为什么有人要将线程ID存储在一个特殊的寄存器中?ARM处理器是否需要线程像MMU那样在内存中有特殊的结构?丝线是什么特别的武器,什么手臂期待找到什么地方?或者我可以不使用这个寄存器就实现线程(有效)吗?

我之所以问这个问题,是因为我在Fuchsia操作系统的Zircon内核上找到了以下代码:

代码语言:javascript
运行
复制
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中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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寄存器之间进行更改。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64856566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档