如何为每个线程确定Linux内核任务的堆栈指针?

nit*_*nms 10 system-calls linux-kernel procfs

我正在研究一种有时会劫持应用程序执行的工具,包括在不同的堆栈中工作.

我正在尝试让内核在执行某些系统调用时总是看到应用程序堆栈,这样它就会在/ proc/pid/maps中的正确位置打印[stack]限定符.

但是,简单地修改系统调用周围的esp似乎是不够的.当我在"cat/proc/self/stat"上使用我的工具时,我看到kstkesp(这里的条目29)有时具有我想要的值,但有时会有一个不同的值,对应于我的备用堆栈.

我想了解:

  1. 如何确定/ proc/self/stat:29中的值?
  2. 我可以修改它,以便它可靠地具有适当的值吗?
  3. 如果2很难回答,你会建议我在哪里理解为什么这个值间歇性地不正确?

小智 1

看起来它是在http://lxr.free-electrons.com/source/fs/proc/array.c?v=3.16的第 409 行中定义的。

过去几年有很多关于相关宏 KSTK_ESP 的讨论,例如: https: //github.com/davet321/rpi-linux/commit/32effd19f64908551f8eff87e7975435edd16624

http://lists.openwall.net/linux-kernel/2015/01/04/140

根据我收集到的有关间歇性奇怪现象的信息,似乎 NMI 或其他中断有时会在内核内部命中,然后在这种情况下它无法正确遍历堆栈。