Jądro systemu
Linux
Wprowadzenie
System operacyjny jest ważną częścią prawie każdego systemu
komputerowego.
System komputerowy można podzielić na cztery części
składowe: sprzęt, system operacyjny, programy użytkowy i
użytkowników.
Sprzęt (procesor, czyli jednostka centralna, pamięć i urządzenia
wejście - wyjście) stanowi podstawowe zasoby systemu
komputerowego.
Programy użytkowe (kompilatory, systemy baz danych,...)
określają sposoby użycia tych zasobów do rozwiązania zadań
stawianych przez użytkowników.
System operacyjny jest programem, który działa jako pośrednik
miedzy użytkownikiem komputera a sprzętem komputerowym.
System operacyjny nadzoruje i koordynuje posługiwanie się
sprzętem przez różne programy użytkowe ,które pracują na
zlecenie różnych użytkowników.
System operacyjny wykonuje różne operacje podstawowe w
imieniu procesów użytkownika.
Czym jest jądro systemu?
Jądro systemu operacyjnego stanowi jego podstawę.
Znajdują się tam główne sterowniki i programy odpowiadające
za działanie systemu.
Każdy system komputerowy posiada zbiór programów, który
nazywany jest systemem operacyjnym. Najważniejszym z tych
programów jest jądro (kernel).
Jądro jest ładowane do pamięci RAM w czasie uruchamiania
systemu, zawiera ono wiele niezbędnych dla systemu procedur.
Kształt i możliwości komputera opierają się na jego jądrze.
Często słowa "system operacyjny" używa się w odniesieniu do
jądra systemu.
Jądro współdziała ze sprzętem poprzez programy niskiego
poziomu.
Dostarcza też środowisko dla aplikacji działających w systemie.
Kiedy program chce wykorzystać zasoby sprzętowe, musi
wystosować odpowiednie zapytanie.
Jądro rozważa to zapytanie i wybiera czy, jak i kiedy użyczyć
programowi potrzebnych mu zasobów.
Budowa jądra
Wyróżniamy kilka podstawowych
metod konstrukcji jąder:
jądro monolityczne
mikrojądro
nanokernel.
exokernel
cachekernel
jądro hybrydowe
Jądro monolityczne
Często stosowane w systemach typu Unix.
Wszystkie zadania są wykonywane przez jądro, będące jednym, dużym
programem działającym w trybie jądra.
Przykładami takiego jądra mogą być: Linux, OpenBSD, FreeBSD, chociaż
większość posiada umiejętność dołączania i odłączania modułów (najczęściej
zawierających kod sterownika urządzenia lub obsługi potrzebnego w danej
chwili systemu plików).
Zaletą tej techniki jest prostota, stabilność, łatwość komunikacji pomiędzy
różnymi członami jądra (to przecież w tym wypadku jeden program!).
Wadą jest, w późniejszym stadium rozwoju projektu, uciążliwość w rozwijaniu
programu oraz w znajdywaniu błędów.
Mikrojądro
Rodzaj jądra systemu operacyjnego, które zawiera tylko
najbardziej niezbędne elementy, takie jak funkcje zarządzania
wątkami, komunikacją międzyprocesową, oraz obsługą
przerwań i wyjątków.
Wszelkie inne zadania, takie jak np. obsługa systemów plików,
sieci, sprzętu realizowane są w przestrzeni użytkownika przez
osobne serwery.
Dobrymi przykładami systemów operacyjnych opartych na
mikrojądrze są Amoeba, QNX, BeOS , Haiku czy Hurd,
mikrojądrami są także (używane w Hurdzie) Mach i L4.
Firma Microsoft pracuje nad własnym rozwiązaniem tego typu w
projekcie Singularity.
Jądro hybrydowe
Jest jądrem opartym o zmodyfikowane architektury jądra monolitycznego oraz
mikrojądra używanych w systemach operacyjnych.
Ten rodzaj jądra budzi kontrowersję w porównaniu do podobnego jądra monolitycznego,
pojęcie to, przez niektórych specjalistów zostało odebrane jako marketing.
Najczęściej akceptowalnymi rodzajami jąder są: jądro monolityczne oraz mikrojądro
(włącznie z nanojądrem i pikojądrem które są jego mniejszymi wersjami).
Pomysł stojący za tym nowym pseudo-rodzajem jądra jest struktura podobna do
mikrojądra, ale zaimplementowana jak jądro monolityczne.
W przeciwieństwie do mikrojądra, wszystkie (lub prawie wszystkie) usługi wykonywane
są w przestrzeni jądra.
Podobnie jak w jądrze monolitycznym, nie ma strat w wydajności wywołanych
przepływem komunikatów mikrojądra i przełączaniem kontekstu między przestrzenią
użytkownika a jądra.
Jednakże, podobnie jak w jądrach monolitycznych, nie ma korzyści wynikających z
umieszczenia usług w przestrzeni użytkownika.
Inne rodzaje jąder systemu
Nanokernel:
Technika zbliżona do techniki mikrojądra, różnica w wielkości -
nanokernel jest jeszcze mniejszy.
Exokernel:
Architektura będąca odmianą nanojądra.
Cechą wyróżniającą jest możliwość zarządzania zasobami systemu
przez nieuprzywilejowanego użytkownika, a rola jądra sprowadza
się do zabezpieczania zasobów.
Przykładem systemu korzystającego z tego typu jądra jest system
XOK, zbudowany w MIT Laboratory for Computer Science,
pracujący na komputerach PC. Wyposażony on został w bibliotekę
ExOS, która implementuje system UNIX i umożliwia uruchamianie
większości aplikacji tego systemu.
Cachekernel:
W tej technice jądro systemu buforuje obiekty systemowe takie jak
wątki czy przestrzenie adresowe tak jak sprzęt komputerowy
buforuje pamięć.
Jądra aplikacji trybu użytkownika są odpowiedzialne za ładowanie
tych danych i ponowne ich zapisanie stosując specyficzne dla
danej aplikacji mechanizmy.
Jądro Linuxa
To najważniejsza, wolna część uniksopodobnego
systemu operacyjnego Linux napisana przez
Linusa Torvaldsa w 1991 roku, a obecnie
rozwijana przez licznych programistów z całego
świata.
Początkowo działało na platformie Intel 80386,
lecz później zostało przeniesione na wiele innych
platform. Największa część kodu napisana jest w
języku C, z pewnymi rozszerzeniami GCC a
pozostała część to wstawki w asemblerze.
Kod jądra Linuksa jest objęty licencją GNU
General Public License, jest zatem
oprogramowaniem FLOSS.
Rodzaje wersji jądra
Istnieją dwa rodzaje dostępnych wersji jądra:
stabilna (stable)
rozwojowa (development).
Stabilna przeznaczone jest dla ludzi ceniących sobie
niezawodność i stabilność systemu jak również jego
bezproblemową obsługę.
Natomiast wersje rozwojowe (developerskie) przeznaczone są
dla ludzi zajmujących się rozwojem jądra, zawierają one często
wiele nowych sterowników dla najnowszych urządzeń i wiele
funkcji eksperymentalnych, które mogą zniknąć w następnym
jądrze. Jądra te mogą także być niestabilne i powodować liczne
problemy.
Pierwsza liczba oznaczenia jądra przedstawia numer wersji,
następna czy jądro jest stabilne (liczba parzysta) czy rozwojowe
(liczba nieparzysta), ostatnia liczba określa natomiast numer
wydania.
Wynika z tego, że wersje stabilne to np. 2.2.40, 2.4.27, 2.6.9.
Jądrami deweloperskimi będą np. 2.3.24, 2.5.75 i w przyszłości
2.7.1.
Różnice pomiędzy jądrami
Linuxa w wersji 2.4 a 2.6
Funkcja
2.4.X
2.6.X
Maksymalna liczba
obsługiwanych procesorów
16
255, NUMA (Non-Uniform Memory
Access)
Maksymalny rozmiar RAM-u
16 GB
64 GB
Maksymalny rozmiar
systemu plików
2 TB
16 TB
Obsługiwane systemy plików
(odczyt i zapis)
Ext2, Ext3, ReiserFS,
JFS, HPFS, FFS,
HFS+, MS DOS, FAT,
VFAT, ISO9660
Ext2, Ext3, ReiserFS, Reiser4, JFS,
HPFS, FFS, HFS, HFS+, MS DOS,
FAT, VFAT, ISO9660, NTFS, XFS
Sieciowe systemy plików
NFSv3, SMB, NCP,
InterMezzo, Coda
NFSv4, SMB, NCP, Intermezzo,
Coda, AFS, CIFS
Rodzaje wątków
LinuxThreads
NPTL (wątki POSIX)
Obsługiwany format dźwięku OSS
ALSA
Obsługa Hyper-threading
Nie
Tak
Liczba możliwych urządzeń
255
4095
Co to są moduły?
Są to części jądra, które nie są zawarte bezpośrednio w nim.
Kompiluje się je osobno i można je umieścić a następnie usunąć z
uruchomionego jądra prawie zawsze.
Z powodu tej elastyczności jest to teraz preferowana metoda pisania
niektórych fragmentów jądra.
Wiele popularnych sterowników urządzeń to ładowalne moduły.
Są to sterowniki różnych urządzeń, które nie są wkompilowane bezpośrednio
w jądro.
Jednak gdy zajdzie potrzeba użycia takiego sterownika zostaje on wtedy
załadowany dynamicznie przez specjalny program ładujący bez przerywania
pracy naszego systemu.
Wszystkie moduły dostępne w naszym systemie znajdują się w katalogu
/lib/modules/numer_wersji_naszego_jądra.
Korzyść z użycia modułów jest taka, że przez ich zastosowanie otrzymujemy
mniejsze i szybsze jądro, dzięki czemu nie trwonimy bez potrzeby zasobów
naszego komputera, w razie gdy potrzebujemy raz na jakiś czas skorzystać z
sterownika a mamy go jako moduł, możemy załadować go na czas pracy, a
gdy już nie będzie nam potrzebny spokojnie możemy skasować go z pamięci.
Jednak nie wszystkie sterowniki możemy użyć jako moduły, Linux potrzebuje
część z nich jeszcze zanim zostaną one załadowane przez system, tak jest
np. z obsługą dysku twardego czy systemu plików, aby system mógł się
poprawnie uruchomić i obsłużyć posiadany przez nas sprzęt.
Co to są łaty (patche)?
Są sposobem na dodawanie do jądra lub
uaktualnianie sterowników lub funkcji.
Nieraz po załataniu jądra, szczególnie
nieoficjalnymi łatami może nie działać ono
poprawnie, lub nawet może nie powieść się
jego kompilacja.
Łatać jądro powinniśmy jedynie wtedy, gdy
jesteśmy pewni jego działania i do tego
najlepiej na osobnej kopii źródeł jądra.
Istnieją łaty oficjalne i nieoficjalne.
Co to są łaty (patche)?
Łaty oficjalne możemy znaleźć na stronie
.
Łaty te zostały zaakceptowane przez twórców jądra i
pozwalają one aktualizować starszą wersję jądra na nowszą.
Np. jądro 2.6.7 za pomocą łaty patch-2.6.8.bz2
zaktualizować jądro 2.6.7 do wersji 2.6.8.
Łaty te, jeśli nie użyjemy wersji testowej z dopiskiem -rc i
nakładamy na niezałatane wcześniej jądro działają
poprawnie.
Oprócz tego możemy także znaleźć codzienne zrzuty z
czasu rozwoju jądra. Posiadają one dopisek -bk.
Ostatnio pojawiły się także łaty poprawiające błędy w
stabilnej już wersji jądra. Posiadają one na końcu jeszcze
jedna cyfrę, np. 2.6.8.1.
Łaty nieoficjalne możemy znaleźć w różnych miejscach,
zazwyczaj poprawiają one działanie jądra, aczkolwiek nie
muszą zawsze działać poprawnie.
Zadanie domowe
Przygotuj opis kompilacji jądra Linuxa.
Możesz korzystać z materiałów
zgromadzonych w Internecie.
Postaraj się opisać ten proces własnymi
słowami (plagiat obniży ocenę).
Limit stron: max. 6 (czcionka min. 12)
Format pliku: .doc lub .pdf
Gotowy opis proszę wysłać na adres:
Termin oddania prac: 11.04.2008