Jądro Linuxa to centralna część systemu operacyjnego, która pośredniczy między sprzętem a programami. Przydziela procesom czas procesora i pamięć, obsługuje urządzenia oraz pilnuje uprawnień. Samo jądro nie jest jednak całym systemem ani dystrybucją Linuxa. To fundament, na którym działają między innymi powłoka, usługi i aplikacje.

Czym jest jądro Linuxa?
Jądro można porównać do zarządcy, który przydziela wspólne zasoby wielu użytkownikom. Program nie steruje bezpośrednio dyskiem, kartą sieciową czy procesorem. Zamiast tego prosi jądro o wykonanie określonej operacji. Dzięki temu aplikacje korzystają z ujednoliconego interfejsu, nawet gdy działają na różnych urządzeniach.
W systemach uniksowych często mówi się, że „wszystko jest plikiem”. Nie oznacza to, że każde urządzenie jest zwykłym dokumentem zapisanym na dysku. Chodzi o wspólny sposób dostępu do zasobów. Pliki urządzeń, wirtualny system /proc czy interfejsy systemowe pozwalają programom komunikować się z funkcjami kontrolowanymi przez jądro.
Jakie zadania wykonuje jądro?
Najważniejszym zadaniem jądra jest izolowanie aplikacji od szczegółów sprzętu i sprawiedliwe dzielenie zasobów. Jądro decyduje, który proces otrzyma czas procesora, jaki obszar pamięci może wykorzystać i czy dany program ma prawo wykonać określoną operację.
| Zadanie | Opis | Wpływ na system |
|---|---|---|
| Zarządzanie procesami | Tworzenie, zatrzymywanie i szeregowanie procesów oraz wątków. | Pozwala wielu programom działać pozornie jednocześnie. |
| Zarządzanie pamięcią | Przydzielanie pamięci RAM, ochrona obszarów procesów i obsługa pamięci wirtualnej. | Ogranicza wzajemne zakłócanie się aplikacji i ułatwia pracę przy ograniczonej ilości RAM. |
| Obsługa urządzeń | Komunikacja ze sprzętem za pomocą sterowników jądra. | Aplikacje mogą korzystać z dysków, sieci, klawiatury czy ekranu bez znajomości ich szczegółowej budowy. |
| System plików | Udostępnianie operacji takich jak otwieranie, odczyt i zapis danych. | Programy korzystają z jednolitego modelu dostępu do różnych nośników i systemów plików. |
User Space i Kernel Space
Procesy są wykonywane w dwóch logicznie odseparowanych obszarach. User Space to przestrzeń aplikacji, takich jak edytor tekstu, przeglądarka czy powłoka. Program działający w tym trybie ma ograniczone uprawnienia i nie może samodzielnie zmieniać pamięci innych procesów ani wydawać dowolnych poleceń sprzętowi.
Kernel Space to uprzywilejowana przestrzeń jądra. Działający w niej kod może zarządzać pamięcią, procesorem i urządzeniami. Granica między tymi obszarami chroni system przed sytuacją, w której zwykła aplikacja uszkodzi dane innego programu albo przejmie kontrolę nad całym komputerem.
Aplikacja może poprosić jądro o usługę przez System Call, czyli wywołanie systemowe. Jest to kontrolowane wejście z przestrzeni użytkownika do funkcji jądra. Przykładami takich operacji są otwarcie pliku, utworzenie procesu, nawiązanie połączenia sieciowego lub przydzielenie pamięci.
Dlaczego Linux ma architekturę monolityczną?
Linux jest jądrem monolitycznym. Oznacza to, że podstawowe podsystemy, między innymi zarządzanie pamięcią, planowanie procesów, sieć i sterowniki, działają w uprzywilejowanej przestrzeni adresowej jądra. Mogą komunikować się bezpośrednio, bez przechodzenia przez dodatkowe warstwy typowe dla niektórych innych modeli architektonicznych.
Taka budowa sprzyja wydajności, ponieważ komunikacja między podsystemami ma niewielki narzut. Ma też koszt. Błąd w kodzie działającym w przestrzeni jądra może mieć poważniejsze skutki niż błąd zwykłej aplikacji, dlatego sterowniki i pozostałe komponenty muszą być starannie zarządzane.
Monolityczny charakter nie oznacza, że całe jądro musi być na stałe zawarte w jednym obrazie. Linux obsługuje ładowalne moduły jądra, czyli komponenty wczytywane dynamicznie, często bez restartowania systemu. Modułem może być między innymi sterownik urządzenia. Pozwala to zachować szybkość modelu monolitycznego, a jednocześnie dopasowywać działające jądro do sprzętu i potrzeb systemu.
Jak jądro komunikuje się ze sprzętem?
Przykładem może być odczyt danych z pliku. Aplikacja nie wysyła polecenia bezpośrednio do dysku. Przepływ wygląda w uproszczeniu następująco:
- Aplikacja żąda otwarcia pliku i odczytania jego zawartości.
- Wywołanie systemowe przekazuje żądanie z User Space do jądra.
- Jądro sprawdza ścieżkę, uprawnienia, stan procesu i dostęp do zasobu.
- System plików oraz sterownik tłumaczą żądanie na operacje właściwe dla konkretnego nośnika.
- Sprzęt zwraca dane, a jądro przekazuje je do pamięci dostępnej dla aplikacji.
Podobny mechanizm działa przy obsłudze karty sieciowej, klawiatury czy urządzenia USB. Katalog /dev udostępnia pliki urządzeń, które tworzą jeden z interfejsów między procesami a sprzętem. Z kolei /proc prezentuje dynamiczne informacje o procesach, pamięci i stanie jądra.
Podczas uruchamiania systemu jądro jest ładowane do chronionego obszaru pamięci. Następnie uruchamiany jest pierwszy proces użytkowy, zwykle systemd z numerem PID 1, który rozpoczyna uruchamianie usług. Samo przydzielanie procesorów, pamięci i dostępu do urządzeń pozostaje zadaniem jądra.
Znaczenie jądra dla systemu
Jądro zapewnia aplikacjom jednolity sposób korzystania z różnego sprzętu, izoluje procesy i kontroluje dostęp do zasobów. Dzięki temu ta sama podstawowa idea działania może być stosowana na serwerach, komputerach osobistych, urządzeniach wbudowanych, smartfonach z Androidem i superkomputerach.
Najkrócej mówiąc, jądro Linuxa nie jest programem, który użytkownik obsługuje bezpośrednio. Jest warstwą wykonującą uprzywilejowane operacje, których aplikacje potrzebują, ale nie powinny wykonywać samodzielnie.