线程控制块和线程本地存储之间的差异以及哪个包含__stack_chk_guard变量



我想知道TCB和TLS之间的区别是什么。另外,两者中的哪一个是变量__stack_chk_guard?

我寻找了很多关于它的信息,但我认为它比以前更让我困惑。

一些站点报告变量__stack_chk_guard在 TCB 中,其他站点在 TLS 中报告它。

提前谢谢。

线程

控制块和线程本地存储之间的差异

这些是不同的术语。阅读维基百科后,差异很明显。

线程控制块是一个内存块。它在操作系统内部分配以保存特定于线程的数据。

线程本地存储是一种编程方法。它包括使用线程的本地数据。

在 C 语言中,线程本地存储持续时间是在线程启动时初始化的对象的存储持续时间,每个线程都有自己独特的对象。

哪个包含__stack_chk_guard变量

编程方法不能"包含",因此 TLS 不会"包含"变量。

那么__stack_chk_guard变量是线程本地变量,答案取决于编译器和体系结构。有了gcc我们有-mstack-protector-guard=guard编译选项,它可以是-mstack-protector-guard=global,在这种情况下,__stack_chk_guard不会在 TLS 中,或者它可以是-mstack-protector-guard=tls,在这种情况下。你猜对了。

另外,两者中的哪一个是变量__stack_chk_guard?

TCB 是一个内存块,TLS 是一种编程方法。这些是不同的术语,不能"成为"变量。

__stack_chk_guard在 TCB 中,其他人在 TLS 中报告。

在编程俚语/行话中,我会说TLS块的含义与TCB相同,可能某些站点正在使用这些术语,就像它们的意思一样(好吧,因为无论如何TLS内存都必须在TCB内部(。

最新更新