Uczę się jądra Linux, ale nie wiem, jak przejść z trybu użytkownika do trybu jądra w systemie Linux. jak to działa? czy możesz dać mi jakąś radę lub podać mi link do niej, lub jakąś książkę na ten temat? dziękuję bardzo!Jak przejść z trybu użytkownika do trybu jądra?
Odpowiedz
Jedynym sposobem aplikacja przestrzeń użytkownik może wyraźnie zainicjować przełącznik trybu jądra podczas normalnej pracy jest poprzez wywołanie systemowe, takie jak open, read, write itp
Ilekroć aplikacja użytkownik wywołuje te interfejsy wywołań systemowych z odpowiednimi parametrami uruchamiane jest przerwanie/wyjątek programowy (SWI).
W wyniku tego SWI kontrola wykonania kodu przechodzi z aplikacji użytkownika do predefiniowanej lokalizacji w tabeli wektora przerwań [IVT] dostarczonej przez system operacyjny.
Ten dokument IVT zawiera adres dla procedury obsługi wyjątku SWI, która wykonuje wszystkie niezbędne kroki wymagane do przełączenia aplikacji użytkownika do trybu jądra i rozpoczęcia wykonywania instrukcji jądra w imieniu procesu użytkownika.
Niezupełnie. Na x86 każdy wyjątek pochodzący z trybu użytkownika przenosi kontrolę do odpowiedniej procedury obsługi wyjątków w systemie operacyjnym, w trybie jądra. –
Prawda. Jak tylko opublikowałem swoją odpowiedź, chciałem ją edytować, co odzwierciedla fakt, że aplikacja użytkownika chce jawnie przejść do trybu jądra. Jednak starałem się to zrobić z powodu problemów z siecią. Zmieniliśmy to teraz, aby to odzwierciedlić. –
@AmarnathRevanna W jaki sposób system operacyjny wie o tym, że w czasie obsługi SWI został przełączony na tryb jądra? Czy istnieje konkretny rejestr/bit sprzętu, który śledzi tryb, który ma być nadzorcą (ring 0)/user (ring 3) i jest aktualizowany na SWI? Zasadniczo, co zapewnia przejście do trybu użytkownika w trybie jądra na poziomie sprzętowym. – Shyam
Właśnie to przeczytałem i jest to całkiem niezły zasób. Wyjaśnia tryb użytkownika i tryb jądra, dlaczego zmiany zachodzą, jak drogie są i daje kilka interesujących lektur.
http://www.codinghorror.com/blog/2008/01/understanding-user-and-kernel-mode.html
Oto krótki fragment:
Kernel Tryb
w trybie jądra, kod wykonujący ma pełny i nieograniczony dostęp do warstwy sprzętowej. Może wykonać dowolną instrukcję CPU i odwołać się do dowolnego adresu pamięci. Tryb jądra jest zazwyczaj zarezerwowany dla najniżej zaufanych funkcji systemu operacyjnego. Awarie w trybie jądra są katastrofalne; zatrzymają cały komputer.
Tryb użytkownika
w trybie użytkownika, kod wykonujący ma możliwość bezpośredniego dostępu do sprzętu lub odniesienia pamięć. Kod działający w trybie użytkownika musi delegować do systemowych interfejsów API, aby uzyskać dostęp do sprzętu lub pamięci. Ze względu na ochronę zapewnianą przez tego rodzaju izolację, awarie w trybie użytkownika są zawsze możliwe do odzyskania. Większość kodu uruchomionego na twoim komputerze będzie działać w trybie użytkownika.
Aby przełączyć się z trybu użytkownika do trybu jądra, należy wykonać wywołanie systemowe.
Jeśli chcesz zobaczyć, co się dzieje pod maską, przejdź do TLDP is your new friend i zobacz kod (jest dobrze udokumentowany, nie ma potrzeby dodatkowej wiedzy, aby zrozumieć kod zespołu).
Jesteś zainteresowany:
movl $len,%edx # third argument: message length
movl $msg,%ecx # second argument: pointer to message to write
movl $1,%ebx # first argument: file handle (stdout)
movl $4,%eax # system call number (sys_write)
int $0x80 # call kernel
Jak widać, wywołanie system jest po prostu otoki wokół kodu montażu, który wykonuje przerwanie (0x80) iw rezultacie program obsługi tego wywołania systemowego będzie wezwany.
Oszukujmy trochę i użyj tutaj preprocesora C do zbudowania pliku wykonywalnego (foo.S jest plikiem, gdzie można umieścić kod z linku poniżej):
gcc -o foo -nostdlib foo.S
go uruchomić poprzez strace aby upewnić się, że dostaniemy to, co piszemy:
$ strace -t ./foo
09:38:28 execve("./foo", ["./foo"], 0x7ffeb5b771d8 /* 57 vars */) = 0
09:38:28 stat(NULL, Hello, world!
NULL) = 14
09:38:28 write(0, NULL, 14)
- 1. Dwukierunkowa interakcja między aplikacją trybu użytkownika i sterownikiem trybu jądra?
- 2. Laravel 5 Jak przejść z trybu produkcji
- 3. Jak usunąć słowo i przejść do trybu wstawiania w Vimie?
- 4. Nie mogę przejść do trybu projektowania w NetBeans (jframe)
- 5. Klawisz obszaru mapy, aby przejść do trybu wstawiania
- 6. Nie można użyć komendy trybu zapisu, Degrading do trybu kompatybilności
- 7. Jak mogę zmienić środowisko robocze Visual Studio z trybu Web z powrotem do trybu Visual C++?
- 8. android Wyjście z trybu pełnoekranowego
- 9. Migrowanie do trybu hibernacji 5 z 3
- 10. Jak wywołać tryb użytkownika z jądra systemu Windows?
- 11. Jak wyłączyć obracanie do trybu poziomego?
- 12. Modyfikowanie wcięcia trybu verilog
- 13. Jak uzyskać dzwoniącego z trybu ścisłego?
- 14. automatycznie wyłączyć globalnego trybu drobne dla konkretnego głównego trybu
- 15. Wyłączanie trybu ścisłego MySQL
- 16. Algorytm trybu obliczeniowego
- 17. Ścisłe naruszenia trybu
- 18. Dlaczego przerwań należy wyłączyć przed przełączeniem do trybu chronionego z trybu rzeczywistego?
- 19. Xcode 4: Skrót klawiaturowy do przełączania trybu asystenta do trybu śledzenia (automatycznego)?
- 20. Jak zrobić iFrame, aby przejść do trybu pełnoekranowego po kliknięciu przycisku?
- 21. Ustawianie trybu blend do rysowania kresek?
- 22. Nie można przełączyć do trybu Drzemki.
- 23. czy istnieje biblioteka systemów plików trybu użytkownika dla systemu Windows?
- 24. Przejście z trybu rzeczywistego do chronionego w jądrze Linuksa
- 25. Jak przejść z trybu systemu Windows SQL Server na tryb mieszany (SQL Server 2008)?
- 26. jak długo trwa przejście androida do trybu drzemki?
- 27. Android Emulator - tryb offline do trybu online
- 28. Emacs: import CSV do trybu org
- 29. Wydajność przy korzystaniu z trybu wsadowego Qt/MySQL
- 30. Dokumentacja trybu org wewnątrz emacs
Jaki jest kontekst swoje pytanie? Pytasz o konkretne mechanizmy procesora na konkretnym procesorze lub ogólnie? Czy jest jakiś problem, który próbujesz rozwiązać? –