stos jądra i stos przestrzeni użytkownika

Jaka jest różnica między stosem jądra a stosem użytkownika? Dlaczego Kernel stack jest używany? Jeśli zmienna lokalna jest zadeklarowana w ISR, gdzie będzie przechowywana? Czy każdy proces ma swój własny stos jądra ? Więc jak proces koordynuje się między tymi stosami?

Author: gnat, 2012-10-16

3 answers

  1. Jaka jest różnica między stosem jądra a stosem użytkownika ?

Krótko mówiąc, nic - poza używaniem innej lokalizacji w pamięci (a co za tym idzie innej wartości dla rejestru stackpointer) i zazwyczaj różnych zabezpieczeń dostępu do pamięci. Tzn. podczas wykonywania w trybie użytkownika, pamięć jądra (której częścią jest stos jądra) nie będzie dostępna nawet jeśli zostanie zmapowana. Odwrotnie, bez wyraźnego żądania kodu jądra (w Linuksie, dzięki funkcjom takim jak copy_from_user()) pamięć użytkownika (w tym stos użytkownika) zwykle nie jest bezpośrednio dostępna.

  1. dlaczego używany jest [osobny ] stos jądra ?
Rozdział przywilejów i bezpieczeństwa. Po pierwsze, programy w przestrzeni użytkownika mogą tworzyć swój stos(wskaźnik), co tylko chcą i zwykle nie ma wymogu architektonicznego, aby mieć nawet poprawny. Jądro nie może więc ufać stosowi przestrzeni użytkownika, aby był poprawny ani użyteczny, a zatem będzie wymagał jednego zestawu pod własną kontrolą. Różne architektury procesorów implementują to na różne sposoby; procesory x86 automatycznie przełączają punkty stosu, gdy występują przełączniki trybu uprawnień, a wartości używane dla różnych poziomów uprawnień są konfigurowalne-za pomocą uprzywilejowanego kodu (tzn. tylko jądra).
  1. jeśli zmienna lokalna jest zadeklarowana w ISR, gdzie będzie przechowywana ?

Na stosie jądra. Jądro (Jądro Linuksa) nie hookuje bezpośrednio do bramy przerwań architektury x86 , ale zamiast tego deleguje wysyłanie przerwań do wspólnego mechanizmu wejścia/wyjścia przerwań jądra, który zapisuje stan rejestru przed przerwaniem przed wywołaniem zarejestrowanego programu obsługi. Sam procesor podczas wysyłania przerwania może wykonać przełącznik uprawnień i / lub stosu, a jest on używany/konfigurowany przez jądro tak, że wspólny kod wprowadzania przerwań może już polegać na stosie jądra bycie obecnym.
To powiedziaĹ ' o, przerwania wystÄ ™ pujÄ ... ce podczas wykonywania kodu kernela bÄ ™ dÄ ... po prostu (nadal) uĺźywaä ‡ stosu kernela w tym momencie. Może to, jeśli programy obsługi przerwań mają głęboko zagnieżdżone ścieżki wywołania, prowadzić do przepełnienia stosu (jeśli głęboka ścieżka wywołania jądra jest przerwana, a program obsługi powoduje kolejną głęboką ścieżkę; w Linuksie, kod RAID systemu plików / oprogramowania jest przerywany przez kod sieciowy z aktywnymi iptables jest znany wyzwalać takie w starszych, nieprzetworzonych jądrach ... rozwiązaniem jest zwiększenie rozmiarów stosu jądra dla takich obciążeń).

  1. Czy każdy proces ma swój własny stos jądra ?

Nie tylko każdy proces - każdy wątek ma swój własny stos jądra (a w rzeczywistości także własny stos użytkownika). Pamiętaj, że jedyną różnicą między procesami a wątkami (dla Linuksa) jest fakt, że wiele wątków może współdzielić przestrzeń adresową (tworząc proces).

  1. jak koordynuje się proces pomiędzy tymi dwoma stosami ?

Wcale - nie musi. Planowanie (jak / kiedy różne wątki są uruchamiane, jak ich stan jest zapisywany i przywracany) jest zadaniem systemu operacyjnego i procesy nie muszą się tym zajmować. Ponieważ wątki są tworzone (a każdy proces musi mieć co najmniej jeden wątek), jądro tworzy dla nich stosy jądra, podczas gdy stosy przestrzeni użytkownika są jawnie tworzone/dostarczane przez dowolny mechanizm używany do tworzenia thread (funkcje takie jak makecontext() lub pthread_create() pozwalają wywoływaczowi określić region pamięci, który ma być używany dla stosu" dziecka " wątku) lub dziedziczony (przez klonowanie pamięci przy dostępie, zwykle nazywane "Kopiuj przy zapisie" / COW, podczas tworzenia nowego procesu).
To powiedziawszy, proces może wpływać na harmonogramowanie swoich wątków i / lub wpływać na kontekst (stan, w tym jest stackpointer wątku). Jest na to wiele sposobów: sygnały UNIX, setcontext(), pthread_yield() / pthread_cancel(), ... - ale to jest trochę odrażające od pierwotnego pytania.

 145
Author: FrankH.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-31 12:26:56

Moja odpowiedź jest zbierana z innych tak pytania z moich rzeczy.

What's the difference between kernel stack and user stack?

Jako programista jądra wiesz, że jądro powinno być ograniczone do błędnych programów użytkownika. Załóżmy, że zachowujesz ten sam stos zarówno dla jądra , jak i przestrzeni użytkownika, a następnie prosty segfault w aplikacji użytkownika zawiesza jądro i wymaga ponownego uruchomienia.

Istnieje jeden "stos jądra" na procesor, taki jak stos ISR i jeden "stos jądra"na proces. Istnieje jeden "stos użytkownika" dla każdego procesu, choć każdy wątek ma swój własny stos, w tym zarówno wątki użytkownika, jak i jądra.

Http://linux.derkeiler.com/Mailing-Lists/Kernel/2004-10/3194.html

Why kernel stack is used?

Więc kiedy jesteśmy w trybie jądra, mechanizm typu stosu jest niezbędny do radzenia sobie z wywołaniami funkcji, lokalnymi zmiennymi podobnymi do przestrzeni użytkownika.

Http://www.kernel.org/doc/Documentation/x86/kernel-stacks

If a local variable is declared in an ISR, where it will be stored?

Będzie przechowywany w stosie ISR (IRQSTACKSIZE). ISR działa na osobnym stosie przerwań tylko wtedy, gdy sprzęt go obsługuje. W przeciwnym razie ramki stosu ISR są popychane na stos przerwanego wątku.

Przestrzeń użytkownika nie wie i szczerze mówiąc nie dba o to, czy przerwanie jest serwowane w stosie jądra bieżącego procesu, czy w osobnym stosie ISR. Ponieważ przerwania przychodzą na procesor, dlatego stos ISR musi być na procesor.

 Does each process has its own kernel stack ?
Tak. Każdy proces ma swój własny stos jądra.
 Then how the process coordinates between both these stacks?
@ FrankH odpowiedź wygląda dla mnie świetnie.
 15
Author: Jeyaram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-03 00:53:57
  1. Jaka jest różnica pomiędzy stosem jądra a stosem użytkownika

Biorąc pod uwagę rozwój jądra Linuksa Roberta Love ' a, główną różnicą jest rozmiar:

Przestrzeń użytkownika może ujść na sucho dzięki statycznemu Przydzielaniu wielu zmiennych na stosie, w tym ogromne struktury i tablice tysięcy elementów.
Takie zachowanie jest legalne, ponieważ przestrzeń użytkownika ma duży stos, który może dynamicznie rosnąć.
Stos jądra nie jest ani duży, ani dynamiczny; jest mały i ma stały rozmiar.
Dokładny rozmiar stosu jądra różni się w zależności od architektury.
Na x86 Rozmiar stosu jest konfigurowalny w czas kompilacji i może być 4KB lub 8KB.
Historycznie stos jądra składa się z dwóch stron, co ogólnie oznacza, że jest to 8KB na architekturach 32-bitowych i 16KB na architekturach 64-bitowych-to rozmiar jest stały i absolutny.
Każdy proces otrzymuje swój własny stos.

Również stos jądra zawiera wskaźnik do struktura thread_info przechowująca informacje o wątku.

 2
Author: arenard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-06 07:08:45