Co to znaczy, gdy kod jest wykonywany w trybie jądra lub użytkownika?
Tryb jądra
Program działający w tym trybie ma pełny dostęp do podstawowego sprzętu. Może wykonywać dowolne instrukcje CPU, uzyskiwać dostęp do dowolnego adresu pamięci i zasadniczo robić wszystko, co chce.
Tryb użytkownika Kod wykonywany w tym trybie jest ograniczony do modyfikacji sprzętowej za pośrednictwem interfejsu API systemu operacyjnego. To nie może uzyskać dostępu do sprzętu bezpośrednio w ogóle .
Interesujące jest to, że na popularnych architekturach wymusza się to sprzętowo - nie tylko system operacyjny. W szczególności architektura x86 ma pierścienie ochronne .
Dużą zaletą tego rodzaju separacji jest to, że gdy program ulega awarii w trybie użytkownika, nie zawsze jest to fatalne. W rzeczywistości w nowoczesnych systemach zwykle tak nie jest.
Sprawdź recenzję Jeffa . To jego zwykłe dobre rzeczy.
Krótka odpowiedź brzmi: mówi tylko, gdzie programy spędzają czas.
Aby uzyskać dłuższą odpowiedź, wyjaśnię to w dwóch krokach. Pierwszy:
1. Wejście w tryb jądra
Każdy napisany kod działa w „trybie użytkownika”.
Programy mogą używać bibliotek do wykonywania typowych zadań. Jest to również kod trybu użytkownika.
W pewnym momencie program może wymagać podstawowej funkcji z systemu. Na przykład:
Ta niezbędna - zbliżona do sprzętu - funkcjonalność jest częścią jądra. To centralny program, który stoi za wszystkim na twoim komputerze. Zarządza wszystkim programami potrzebnymi do działania.
Aby użyć funkcji w jądrze, ścieżka wykonania programu dosłownie przeskakuje z trybu użytkownika do kodu jądra. Jądro wykonuje swoją pracę i składa ścieżkę wykonania z powrotem do trybu użytkownika.
Kiedy program spędza dużo czasu w trybie jądra, często oznacza to, że wykonuje wiele czynności związanych ze sprzętem. Na przykład wyszukiwanie dysku lub przesyłanie strumieniowe wideo. Sprzęt może również działać nieprawidłowo; spowalniając przetwarzanie i powodując, że program spędza niezwykłą ilość czasu w przestrzeni jądra.
2 różnica
Kod w przestrzeni jądra ma wysoką wydajność. Pozostałe części jądra mogą go wywoływać bezpośrednio, a kod ma bezpośredni dostęp do każdego zasobu systemu, bez sprawdzania granic. Przełączanie między trybem jądra / użytkownika jest również kosztowną operacją, której można całkowicie uniknąć, uruchamiając wszystko w kodzie jądra.
Wewnątrz jądra nie ma jednak wiele miejsca na sprawdzanie bezpieczeństwa, ochronę przed awariami lub zapisywanie w niewłaściwych częściach pamięci. Są to usługi, które jądro może udostępniać innym programom. Podstępnie oszukuje programy, aby wierzyć, że świat wygląda inaczej (programy żyją w wirtualnym środowisku z piaskownicą / ograniczeniami), dlatego wszystko, co wchodzi / wychodzi z programów, może być tłumaczone i strzeżone.
Samo jądro nie może mieć dużej ochrony, ponieważ nie ma za nim nic, co mogłoby go chronić. To jest serce systemu, a kiedy to się skończy, wszystko się kończy. Występuje panika jądra lub w systemie Windows słynny BSOD.
Takie jest również ryzyko kodu opartego na jądrze i powód, dla którego więcej podsystemów o niskich wymaganiach wydajnościowych jest przenoszonych do przestrzeni użytkownika. Niezbędnymi częściami związanymi ze sprzętem są zazwyczaj kod jądra, który nie zmieni się w najbliższym czasie.
Jest to rozróżnienie, czy aktualnie wykonywany kod może bezpośrednio oddziaływać na różne elementy sprzętu. Kod trybu jądra może zapisywać na szynach urządzeń, zmieniać odwzorowania pamięci, przełączać uruchomione procesy i tak dalej. Tryb użytkownika może wykonywać obliczenia i może wykonywać wywołania systemowe w jądrze w celu interakcji z resztą świata.