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

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

据我了解,堆栈金丝雀的工作原理如下:程序启动时会生成一个随机值并将其存储在线程本地存储(%fs:0x28)中。然后,在每个函数调用中将该随机值压入堆栈,以便稍后进行检查。

关于 TLS 区域中的“master-cookie”,我有两个问题:

  1. 考虑典型的内存进程布局: 在此输入图像描述

线程本地存储在此布局中的什么位置?

  1. 当进程生成一个新线程时,线程本地存储(以及堆栈金丝雀值)是否会被复制到该新线程?或者内核是否为每个线程生成一个新的堆栈金丝雀值?

答案1

  1. 当产生新线程时,将为该线程的堆栈分配内存区域。线程局部变量的空间是从该区域分配的。严格来说,TLS 变量并不是堆栈的一部分,即它们不会被压入堆栈或从堆栈弹出,但它们存在于堆栈顶部的同一区域中。

    该区域位于地址空间中的位置取决于很多因素。当使用 创建新线程时pthread_create,程序员可以传递一个指向内存的指针以用作线程的堆栈。该内存的位置取决于内存的分配方式。如果没有使用预先分配的内存,则使用mmapwithNULL作为addr参数来分配内存区域,这让内核决定内存映射到哪里。在 x86_64 上,以这种方式分配的内存位于堆栈和堆之间。

  2. 每个线程都使用一个新的金丝雀值。查看答案这个问题

相关内容