Как определяется указатель стека задач ядра Linux для каждого потока?

Я работаю над инструментом, который иногда захватывает выполнение приложения, включая работу в другом стеке.

Я пытаюсь заставить ядро ​​всегда видеть стек приложения при выполнении определенных системных вызовов, чтобы он распечатывал квалификатор [stack] в нужном месте в /proc/pid/maps.

Однако простое изменение esp вокруг системного вызова кажется недостаточным. Когда я использую свой инструмент на "cat/proc/self/stat", я вижу kstkesp (запись 29 здесь) иногда имеет значение я но иногда имеет другое значение, соответствующее моему альтернативному стеку.

Я пытаюсь понять:

  • Как определяется значение, отраженное в /proc/self/stat: 29?
  • Могу ли я изменить его, чтобы он надежно имел соответствующее значение?
  • Если 2 трудно ответить, где бы вы порекомендовали, чтобы я понял, почему значение прерывисто неверно?

Ответ 1

Похоже, что он определен, например. в строке 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 или другие прерывания попадают в ядро, а затем в этом случае он не будет нормально ходить в стеке.