首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >堆栈金丝雀是否通过线程共享?

堆栈金丝雀是否通过线程共享?
EN

Unix & Linux用户
提问于 2019-07-04 16:57:57
回答 1查看 692关注 0票数 3

据我所知,堆栈金丝雀就像萤火虫一样工作:程序启动时会生成一个随机值,并将其存储在线程本地存储(%fs:0x28)中。然后,在每个函数调用中将这个随机值推送到堆栈上,以供以后对照。

关于TLS地区的“大师饼干”,我有两个问题:

  1. 考虑到典型的内存进程布局:

在这个布局中,线程本地存储在哪里?

  1. 当进程生成一个新线程时,线程本地存储(因此,堆栈金丝雀值)会被复制到那个新线程中吗?还是内核为每个线程生成一个新的堆栈金丝雀值?
EN

回答 1

Unix & Linux用户

发布于 2019-07-10 06:28:43

  1. 生成新线程时,将为线程的堆栈分配内存区域。线程局部变量的空间是从这个区域分配的。TLS变量不是堆栈的严格部分,也就是说,它们不会被弹出推到堆栈中,但它们存在于堆栈顶部的同一区域。该区域位于地址空间的位置取决于许多因素。当使用pthread_create创建新线程时,程序员可以传递一个指向内存的指针,作为线程的堆栈。此内存的位置取决于如何分配内存。如果没有使用预先分配的内存,那么使用mmap分配内存区域,NULL作为addr参数,让内核决定内存映射的位置。在x86_64上,以这种方式分配的内存位于堆栈和堆之间。
  2. 每个线程都使用一个新的金丝雀值。见这个问题的答案。
票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/528424

复制
相关文章

相似问题

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