Pytanie CPU Przełącza z trybu użytkownika do trybu jądra: co dokładnie robi? W jaki sposób to przejście?


procesor Przełącza z trybu użytkownika do trybu jądra: co dokładnie robi? W jaki sposób to przejście?

EDYTOWAĆ:

Nawet jeśli zależy to od architektury, proszę podać odpowiedź. Architektura należy do Ciebie. Opowiedz mi o architekturze, o której wiesz.

Chcę się zorientować, jakie rzeczy będą w to zamieszane.


24
2018-03-19 16:59


pochodzenie


Jest zależny od architektury i niekoniecznie zależy od systemu operacyjnego. - Nathan Osman


Odpowiedzi:


Uwaga: dotyczy to głównie architektury x86. Oto nieco uproszczone wyjaśnienie.

Przejście jest zwykle spowodowane przez jedną z następujących czynności:

  • Błąd (np. Błąd strony lub inny wyjątek spowodowany wykonaniem instrukcji)
  • Przerwanie (np. Przerwanie klawiatury lub zakończenie operacji we / wy)
  • Pułapka (np. Wywołanie systemowe)

Normalnie dzieje się tak, że system sprawdza tabelę deskryptorów przerwań (IDT). Każdy wyjątek (interrupt, fault, itp.) Ma przypisany numer, który jest używany do indeksowania do tej tabeli.

Z tej tabeli procesor może określić obsługę przerwań.

W ramach przejścia następują następujące zmiany (ogólnie):

  • Przełącz na stos Kernela
  • EFLAGS są zapisywane
  • Selektor segmentu kodu i EIP są zapisywane.
  • Selektor segmentu stosu i wskaźnik stosu są zapisywane
  • Rozpocznij wykonywanie obsługi przerwań
  • Rejestry ogólnego przeznaczenia są zapisywane (zadanie handler'a)
  • Selektory segmentów zostają zmienione na Kernel (zadanie handler'a)

Jesteś teraz w trybie jądra.

Mam nadzieję, że pomaga :)


29
2018-03-20 21:43



Czy przerwania są wyłączone podczas wykonywania procedury przerwania? A może przerywanie wyższego priorytetu może przerwać działanie obsługi przerwań? Czy może istnieć przełącznik kontekstu podczas wykonywania obsługi przerwania? - Sharat Chandra
Aby wyjaśnić: Czy masz na myśli "system operacyjny" podczas pisania "system sprawdza tabelę deskryptorów przerwań"? - Martin Thoma
@MartinThoma, tak, teraz działa kod OS. - fante


Jest to zależne od systemu, ale zwykłym mechanizmem jest to, że niektóre operacje w terenie użytkownika powodują przerwanie oprogramowania. To przerwanie powoduje przełączanie trybów procesora i przeskakiwanie do kodu jądra, który następnie sprawdza, co program próbował wykonać (wywołanie systemowe?), A następnie wykonuje żądaną akcję i przeskakuje z powrotem do kodu trybu użytkownika. Inne mechanizmy oprócz przerwania oprogramowania mogą również spowodować przejście; na przykład w systemie wielozadaniowym z wyprzedzeniem, przerwanie zegara może uruchomić program planujący.


4
2018-03-19 17:04



Czy są to dwie jedyne sytuacje, w których procesor przechodzi w tryb jądra? - claws
@claws, to całkowicie procesor, system operacyjny i zależne od implementacji. - Carl Norum
Komentarz dotyczący wywołań systemowych zdarzających się przez przerwanie jest nieco przestarzały. Starsze systemy Linux używają przerwania 0x80, aby przełączyć się do trybu jądra w wywołaniu systemowym. Ale w przypadku nowszych procesorów (gdzie nowością jest coś> pentium 2) i jądra linuksa, nastąpiło przejście do korzystania z funkcji "szybkiego wywołania systemowego", zapewnionej przez instrukcje sysensu, sysexit. Sprawdzić articles.manugarg.com/systemcallinlinux2_6.html - Jasmeet
@Jasmeet, to nadal semantycznie równoznaczne z przerwaniem oprogramowania, nawet jeśli nie ma takiej nazwy w żargonie Intela. - Carl Norum


Rozumiem, że każdy program, którego rejestry segmentu mają dwa bloki zerowe, będzie działał w trybie jądra, podczas gdy każdy program, którego rejestry segmentów mają dwa LSB = 1, będzie działał w trybie użytkownika. W rzeczywistości dwa LSB rgeisters segmentu zdefiniować poziom Priviledge (0 najwyższy do 3 najniższy)

Tak więc, aby uruchomić prgrama w trybie jądra, musisz ustawić rejestry segmentów na 0010 hex (jak sądzę). Nie jestem pewien, w jaki sposób można umieścić program w tej przestrzeni pamięci bez nadpisywania czegoś innego - innymi słowy, w jaki sposób zapewnia to linker? Ponadto, jeśli chcesz wywołać kod trybu jądra z kodu trybu użytkownika, musisz dowiedzieć się, jak przekazywać parametry - nie używają one tego samego modułu pamięci, więc nie mogą przekazywać danych przez odwołanie do pamięci. Chyba musisz przekazać to w rejestrach.

Jeśli anody mogą wypełnić luki w powyższym, byłbym bardzo wdzięczny.


3
2017-11-18 07:28





W systemie Windows, po wywołaniu wywołania systemowego, procedury biblioteczne wywołują punkt wejścia jądra rezydujący w przestrzeni adresowej systemu operacyjnego. To z kolei przenosi procesor do trybu nadzorującego, wykonując instrukcje specyficzne dla tego celu, takie jak sysenter. To, co robi, polega zasadniczo na ustawieniu bitu w rejestrze flag. Umożliwia to systemowi operacyjnemu korzystanie z uprzywilejowanych instrukcji.


1
2018-03-19 21:29