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

时间:2015-06-11 15:25:56

标签: linux-kernel system-calls procfs

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

我试图让内核在执行某些系统调用时始终看到应用程序堆栈,这样它就会在/proc/pid/maps.

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

我试图理解:

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

1 个答案:

答案 0 :(得分: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或其他中断有时在内核中命中,然后在这种情况下它没有正确地走栈。