2011-02-09 19 views
9

Jaka jest potrzeba używania dwóch różnych stosów w tym samym programie? W jaki sposób pułapka zmienia bieżący stos programu ze stosu użytkowników na stos jądra? Jak wraca do stosu użytkowników po zakończeniu wywołania systemowego?Jaka jest różnica między stosem jądra a stosem użytkownika?

Czy każdy proces ma stos jądra i użytkownika?

+2

Jakiej architektury się uczysz? – Gabe

+0

http://www.cs.umb.edu/~eoneil/cs444_f06/class10.html: coś dobrego, aby wyjaśnić problem. Z uniwersyteckiej strony internetowej !! –

+0

Zemdlałem z uniwersytetu 5 lat temu i to pytanie wciąż przypomina mi moje studia licencjackie. Za każdym razem, gdy otrzymuję powiadomienie o tym pytaniu na przepełnienie stosu, jestem pełen nostalgii. – user609306

Odpowiedz

3

Jedną z przyczyn posiadania osobnego stosu jądra jest to, że jądro potrzebuje miejsca do przechowywania informacji, których kod trybu użytkownika nie może go dotknąć. Zapobiega to przypadkowemu lub złośliwemu wpływowi na wykonanie jądra kodu trybu użytkownika działającego w innym wątku/procesie.

4

co jest konieczność korzystania z dwóch różnych stosów w tym samym programie

Nigdy nie słyszałem zarówno jądra i stosu użytkownika w ramach jednego procesu, choć może to być bardzo powszechne. Omówiono here.

Stos kernela musi być odizolowany od stosu trybu użytkownika. W przeciwnym razie kod trybu użytkownika może uszkodzić stos jądra, powodując awarię jądra.

jaki sposób pułapkę zmienia bieżący stos programu ze stosu użytkownika do stosu jądra

może chcesz szukać czegoś podobnego w Intel Software Developer's Manuals.

robi każdy proces ma jądra i stosu użytkownika

Zakładam, że to zależy od projektu systemu operacyjnego, choć być może jest to dość powszechne. Podane powyżej linki wskazują, że Linux używa dwóch (lub więcej) stosów na proces. Nie słyszałem o systemie Windows przy użyciu stosu trybów jądra dla poszczególnych procesów.

+0

oznacza, że ​​Windows ma jeden stos jądra na procesor, a Linux ma zarówno stos użytkownika, jak i jądra na proces. – user609306

10

Istnieje jeden "stos kernela" na procesor. Dla każdego procesu istnieje jeden "stos użytkowników", chociaż każdy wątek ma własny stos, w tym wątki użytkownika i jądra.

Sposób "zalewkowania zmienia stos" jest w rzeczywistości dość prosty.

Procesor zmienia procesy lub "tryby" w wyniku przerwania. Przerwanie może wystąpić z wielu różnych powodów - pojawia się błąd (np. Błąd lub błąd strony) lub fizyczne przerwanie sprzętowe (np. Z urządzenia) - lub przerwanie zegara (które występuje, na przykład, gdy proces użył wszystkich jego przydziału czasu procesora „)

czy inaczej. - kiedy to przerwanie jest nazywany, rejestry CPU są zapisywane na stosie - wszystkie rejestry. - tym samym wskaźnik stosu

Zazwyczaj wtedy” scheduler Harmonogram następnie wybiera inny proces do uruchomienia - przywracanie wszystkich zapisanych rejestrów , w tym wskaźnika stosu, i kontynuuje wykonywanie od miejsca, w którym zostało przerwane (przechowywane w wskaźniku adresu zwrotnego)

Nazywa się to "przełącznikiem kontekstu".

Upraszczam kilka rzeczy - na przykład sposób zapisywania i przywracania kontekstu zarządzania pamięcią, ale taki jest pomysł.To tylko zapisywanie i przywracanie rejestrów w odpowiedzi na przerwanie - w tym rejestr "wskaźnika stosu".

+0

oznacza to, że Windows ma jeden stos jądra na procesor, a linux ma stos dla użytkownika i jądra na proces. – user609306

+3

W systemie Windows każdy wątek (nawet wątki trybu użytkownika) ma własny stos jądra. Sterty Kernela zdecydowanie nie są na procesor. – Gabe

0

Jest zależny od systemu operacyjnego. Powodem tego jest podstawowe bezpieczeństwo systemu operacyjnego. To dzięki starannej konstrukcji samego systemu operacyjnego. Na przykład niektóre procesory mają stosy Kernel, Executive, Supervisor i User.

Renee

7

Istnieją 2 stosy, ponieważ istnieją 2 konteksty wykonanie CPU. Stos trybów użytkownika dostosuje się do twojego programu w odniesieniu do tworzenia ramek stosów dla funkcji, zmiennych lokalnych, adresów powrotnych itp. Gdy procesor przełącza kontekst na tryb jądra, na przykład podczas wykonywania wywołania systemowego, potrzebuje dostępu do pamięci jądra i struktur danych i tak przełącza się na używanie stosu jądra. I tak, Unix Wierzę, że używa stosu jądra na proces.

3

Uczę się OS na uniwersytecie, a nasz projekt opiera się na OS/161 zbudowanym przez Harvard. Tak więc moja odpowiedź opiera się na tym systemie operacyjnym.

W OS/161 każdy wątek ma 2 stosy - jeden dla użytkownika/aplikacji, jeden dla programu jądra.

1. Jaka jest potrzeba używania dwóch różnych stosów w tym samym programie?

Załóżmy, że stosujemy tylko stos w trybie aplikacji. Ponieważ przestrzeń pamięci jest udostępniona przez wiele wątków, jeśli jakiś inny wątek przypadkowo nadpisuje adres używany przez jądro, może to spowodować awarię jądra, co prowadzi do bardzo wrażliwego systemu operacyjnego.

2. W jaki sposób pułapka zmienia bieżący stos programu ze stosu użytkowników na stos jądra?

w OS/161, pułapka służy do transferu z aplikacji do jądra. Istnieją trzy mechanizmy, które mogą wywołać pułapkę: Wywołania systemowe, wyjątki i przerwań. Ramka pułapki w stosie jądra służy do zapisywania bieżącego kontekstu wątku.

Poniżej szczegółowy proces (od lecture note of UWaterloo CS350):

  • Gdy jeden z powyższego mechanizmu nastąpi, sprzętowy przełącza procesor w trybie uprzywilejowanym i przekazuje sterowanie do określonej lokalizacji, w którym jądro powinien znajdować się przewodnik.

  • Handler jądro tworzy ramkę pułapkę i używa go do oszczędza kontekst wątku aplikacji tak, że kod obsługi mogą być wykonywane na CPU.

  • Tuż przed obsługi jądra zakończy wykonywanie, przywraca się kontekstu aplikacji gwintu z ramą pułapki, przed powrotem sterowanie do aplikacji.

3. Jak wraca do stosu użytkowników po zakończeniu wywołania systemowego?

Powyższy proces wyraźnie wyjaśnia również na to pytanie.

+0

dziękuję, to było 4 lata, że ​​zadałem to pytanie, byłem na uniwersytecie tym razem. Twoja odpowiedź jeszcze bardziej zwiększyła moją wiedzę. – user609306

0

Kontekst procesu (psw, stan rejestrów, pc ...) jest zapisywany na płytce PCB procesu, w przestrzeni pamięci jądra, a nie w stosie. Tak, istnieje jeden stos dla każdego procesu użytkownika i więcej, jeden stos dla każdego wątku w pamięci przestrzeni użytkownika. W kernelu struktury danych są współużytkowane przez kody wielokrotności funkcji w jądrze. Stos jest używany do wywoływania procedury i zmiennych lokalnych, a nie do zapisywania kontekstu.

Powiązane problemy