2015-06-11 41 views
10

Pracuję nad narzędziem, które czasami przejmuje kontrolę nad wykonaniem aplikacji, w tym pracą w innym stosie.Jak określa się wskaźnik stosu jądra Linux dla każdego wątku?

Staram się, aby jądro zawsze widziało stos aplikacji podczas wykonywania niektórych wywołań systemowych, aby wydrukować kwalifikator [stosu] we właściwym miejscu w/proc/pid/mapach.

Jednak zwykłe modyfikowanie funkcji esp wokół wywołania systemowego wydaje się niewystarczające. Kiedy używam swojego narzędzia w "cat/proc/self/stat", widzę, że kstkesp (entry 29 here) czasami ma wartość, którą chcę, ale czasami ma inną wartość, odpowiadającą mojemu alternatywnemu stosowi.

Próbuję zrozumieć:

  1. Jak jest wartość odzwierciedlenie w/proc/self/stat: 29 określona?
  2. Czy mogę go zmodyfikować, aby w niezawodny sposób miał odpowiednią wartość?
  3. Jeśli trudno jest odpowiedzieć na 2, gdzie chciałbyś polecić, abym zrozumiał, dlaczego wartość jest nieregularnie niepoprawna?

Odpowiedz

1

Wygląda na to, że został zdefiniowany, np. w linii 409 z http://lxr.free-electrons.com/source/fs/proc/array.c?v=3.16 do mnie.

Jest wiele dyskusji na temat powiązanego makro KSTK_ESP w ciągu ostatnich kilku lat, na przykład: https://github.com/davet321/rpi-linux/commit/32effd19f64908551f8eff87e7975435edd16624

i

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

Z czego wnoszę dotyczące przerywanego oddness wydaje się jak NMI lub inne przerywane trafienia wewnątrz jądra, a następnie nie przesuwają stosu w tym przypadku.

+0

Rudi, chodziło mi o to, gdzie wskazuje makro KSTK_ESP, to znaczy, gdzie jest ustawiona wartość wprowadzona do pozycji 29/proc/pid/stat, a nie jak jest ona ustawiana do ustawienia pozycji 29. I da ci nagrodę, ponieważ moje pytanie nie było wystarczająco jasne. Jeśli możesz edytować swoją odpowiedź, aby uwzględnić te informacje, byłbym wdzięczny. – nitzanms

+1

Obawiam się, że zajęłoby mi to tygodnie nauki, aby dać ci bardziej solidną odpowiedź. Myślę, że jest to specyficzne dla architektury, ponieważ dotyczy bloku zadań. Ta odpowiedź trwała zaledwie godzinę lub dwie i byłem szczęśliwy, że mogłem to zrobić, ponieważ od czasu do czasu robiłem mały wkład w jądro. Przepraszam, nie mogę ci więcej powiedzieć. –

+0

To jest fajne. To, co mi dałeś, jest doceniane. Z pewnością lepsze to niż marnowanie całej reputacji. Czy to by miało znaczenie, gdybym ograniczył moje pytanie tylko do x86 (_64)? – nitzanms