2015-06-11 9 views
10

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

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

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

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

  1. Как значение отражается в/Proc/себе/стата: 29 определяется?
  2. Могу ли я изменить его, чтобы он надежно имел соответствующее значение?
  3. Если 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

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

+0

Rudi, я имел в виду, где макрос KSTK_ESP указывает, то есть, где задано значение, которое мы ввели в запись 29 из/proc/pid/stat, а не как к нему обращаются, чтобы установить запись 29. I Я собираюсь дать вам щедрость, потому что мой вопрос был недостаточно ясен. Если вы можете отредактировать свой ответ, чтобы включить эту информацию, я был бы благодарен. – nitzanms

+1

Боюсь, мне понадобится неделя обучения, чтобы дать вам более солидный ответ. Я думаю, что это несколько сложный, поскольку он включает блок задач. Этот ответ был всего лишь час или два, и я был счастлив сделать это, потому что иногда делал небольшой вклад в ядро. Извините, я больше не могу вам рассказать. –

+0

Это круто. То, что вы мне дали, ценится. Конечно, лучше, чем позволить всей репутации идти впустую. Будет ли это иметь значение, если я ограничил свой вопрос только x86 (_64)? – nitzanms