2015-06-11 10 views
10

Ich arbeite an einem Tool, das manchmal die Ausführung von Anwendungen hemmt, einschließlich der Arbeit in einem anderen Stapel.Wie wird der Stapelzeiger eines Linux-Kernel-Tasks für jeden Thread ermittelt?

Ich versuche, den Kernel zu sehen immer den Anwendungsstapel bei bestimmten Systemaufrufen, so dass es das [stack] Qualifikationsmerkmal an der richtigen Stelle in/proc/pid/maps drucken wird.

Die einfache Änderung der ESP um den Systemaufruf scheint jedoch nicht genug zu sein. Wenn ich mein Tool auf "cat/proc/self/stat" verwende, sehe ich, dass kstkesp (entry 29 here) manchmal den Wert hat, den ich möchte, aber manchmal einen anderen Wert hat, der meinem alternativen Stack entspricht.

Ich versuche zu verstehen: in/proc/self/stat reflektiert

  1. Wie wird der Wert: 29 bestimmt?
  2. Kann ich es so ändern, dass es einen angemessenen Wert hat?
  3. Wenn 2 schwer zu beantworten ist, wo empfehlen Sie, dass ich verstehe, warum der Wert intermittierend falsch ist?

Antwort

1

Sieht so aus, als ob es z.B. in Zeile 409 von http://lxr.free-electrons.com/source/fs/proc/array.c?v=3.16 zu mir.

Es gibt viel Diskussion über die damit verbundene Makro KSTK_ESP in den letzten Jahren zum Beispiel: https://github.com/davet321/rpi-linux/commit/32effd19f64908551f8eff87e7975435edd16624

und

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

Von dem, was ich sammeln in Bezug auf die intermittierende oddness scheint es wie ein NMI oder andere Unterbrechungstreffer innerhalb des Kernels manchmal und dann geht es in diesem Fall nicht richtig den Stapel.

+0

Rudi, was ich meinte, ist, wo das KSTK_ESP Makro zeigt, das heißt, wo ist der Wert, den wir in Eintrag 29 von/proc/pid/stat gesetzt haben, nicht, wie auf Eintrag 29 zugegriffen wird Ich werde dir die Belohnung geben, weil meine Frage nicht klar genug war. Wenn Sie Ihre Antwort bearbeiten können, um diese Informationen aufzunehmen, wäre ich Ihnen dankbar. – nitzanms

+1

Ich fürchte, es würde Wochen dauern, um Ihnen eine fundierte Antwort zu geben. Ich denke, es ist etwas archspezifisch, da es den Aufgabenblock beinhaltet. Diese Antwort war nur eine oder zwei Stunden und ich war glücklich, es zu tun, weil ich gelegentlich einen kleinen Beitrag zum Kernel geleistet habe. Entschuldigung, ich kann dir nicht mehr sagen. –

+0

Das ist cool. Was du mir gegeben hast, wird geschätzt. Sicher besser, als den ganzen Ruf verschwenden zu lassen. Würde es einen Unterschied machen, wenn ich meine Frage nur auf x86 (_64) beschränke? – nitzanms

Verwandte Themen