2009-05-20 17 views
21

Czy stos jądra dla całego procesu jest udostępniony, czy dla każdego procesu istnieje osobny stos jądra? Jeśli jest oddzielny dla każdego procesu, w którym przechowywany jest ten wskaźnik stosu? W obiekcie task_struct?stos jądra dla procesu linuxowego

Odpowiedz

17

Istnieje tylko jedna powszechna pamięć jądra. W nim każdy proces ma własny moduł task_struct + stos jądra (domyślnie 8K).

W przełączniku kontekstu stary wskaźnik stosu jest gdzieś zapamiętywany, a aktualny wskaźnik stosu jest ustawiony tak, aby wskazywał na wierzchołek stosu (lub na dole w zależności od architektury sprzętowej) nowego procesu, który ma zostać uruchomiony.

+1

gdzie jest przechowywany ten wskaźnik stosu? – suresh

+2

W przełączniku kontekstu stara wartość wskaźnika stosu jest przechowywana w elemencie task_struct procesu, który jest zastępowany nowym procesem, a wskaźnik stosu dla nowego procesu jest odczytywany z bloku task_struct tego nowego procesu. –

12

This old article mówi, że każdy proces ma własny stos jądra. Zobacz komentarze, dlaczego wydaje się to bardzo dobry projekt.

Próbowałem reading the current source, aby się upewnić, ale ponieważ stos jądra jest "niejawny", nie jest widoczny w task_struct. Jest to wspomniane w artykule.

Ta odpowiedź została zredagowana w celu uwzględnienia mądrości z komentarzy. Dzięki.

+3

Poważnie wątpię, że można to zmienić. Stos jądra to niepodzielna przestrzeń, w której wywołania systemowe mogą umieszczać swoje dane. Jeśli chcesz je udostępnić między procesami, kilka procedur jądra może użyć tego samego stosu w tym samym czasie -> uszkodzenie danych. –

+1

Myślę, że każdy proces wymaga własnego stosu jądra, ponieważ kilka różnych procesów może wykonywać jednocześnie wywołania systemowe i nie chciałbyś, żeby się pomieszały. –

+0

Każdy proces ma własny stos jądra i każdy stos jądra ma powiązany proces. To nigdy nie zostało zmienione. Dlatego w "ps" jest coś takiego jak pseudo proces. –

2

Książka "Linux kernel Development" Roberta Love ma dobre wyjaśnienie na temat stosu jądra procesu.

I tak, każdy proces ma własny stos jądra i jeśli się nie mylę, jego wskaźnik jest przechowywany na strukturze thread_info. Ale nie jestem do końca pewien, a struktura struct struct jest przechowywana na początku lub na końcu stosu jądra procesu, w zależności od architektury procesora.

Pozdrawiam. Carlos Maiolino

+2

Od jądra Linux 2.6, struktura 'thread_info' przechowywana jest na końcu stosu jądra każdego procesu, a nie struktury task_struct. Struktura 'thread_info' zawiera wskaźnik do struktury' task_struct' –

1

Myślę, że każdy proces ma własny stos trybów jądra. Sterownik jest uruchamiany w trybie jądra, proces ten czasami będzie blokowany podczas wykonywania procedury sterownika. a system operacyjny może zaplanować uruchomienie innego procesu. Zaplanowany proces może ponownie wywołać procedurę sterownika. Jeśli stos jądra jest współużytkowany, 2 procesy używają stosu jądra, rzeczy będą pomieszane. Zaskoczyło mnie to pytanie przez długi czas. Na początku wydaje mi się, że stos kernela jest udostępniony, niektóre książki to mówią. Po przeczytaniu jądra Linux Development i zobaczeniu kodu sterownika, zaczynam myśleć, że stos jądra nie jest udostępniany.

Powiązane problemy