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



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

我试图让内核在执行某些系统调用时始终看到应用程序堆栈,以便它将 [stack] 限定符打印在/proc/pid/maps 中的正确位置。

但是,仅仅修改系统调用周围的 esp 似乎还不够。当我在"cat/proc/self/stat"上使用我的工具时,我看到 kstkesp(此处的条目 29)有时具有我想要的值,但有时具有不同的值,对应于我的备用堆栈。

我试图理解:

  1. 如何确定/proc/self/stat:29 中反映的值?
  2. 我可以修改它以使其可靠地具有适当的值吗?
  3. 如果 2 很难回答,您会建议我在哪里查看以了解为什么该值间歇性不正确?

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

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

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

从我收集的关于间歇性奇怪之处的信息来看,NMI 或其他中断有时会在内核内部命中,然后在这种情况下它无法正确遍历堆栈。

相关内容

最新更新