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