[ Pobierz całość w formacie PDF ]

w czasie działania jądra. Stos ten ma rozmiar 8 kB na platformach 32-bitowych oraz
16 kB na wikszości platform 64-bitowych.
Szersze omówienie stosu jądra znajduje si w podrozdziale  Statyczne przydziały na
stosie w rozdziale 10.
Synchronizacja i współbieżność
Jądro jest podatne na sytuacje hazardowe wynikające ze współbieżności operacji. W prze-
ciwieństwie bowiem do jednowątkowej aplikacji przestrzeni użytkownika wiele funkcji
jądra pozwala na współbieżny dostp do zasobów, wymagając tym samym odpowied-
niej synchronizacji eliminującej konflikty. W szczególności:
Jądro systemu Linux obsługuje wieloprzetwarzanie. Bez odpowiedniej
ochrony kod jądra wykonywany na dwóch lub wicej procesorach mógłby
doprowadzić do równoczesnych prób dostpu do jednego zasobu.
Jądro systemu Linux obsługuje asynchroniczne wzgldem aktualnie
wykonywanego kodu przerwania. Bez odpowiedniej ochrony mogłoby dojść
do sytuacji, w której przerwanie pojawia si w środku operacji dostpu do
współużytkowanego zasobu, do którego odwołuje si również procedura
obsługi przerwania.
Jądro systemu Linux podlega wywłaszczaniu, dlatego też bez odpowiedniej
ochrony kod jądra mógłby zostać wywłaszczony na rzecz innego kodu
odwołującego si do tego samego zasobu.
36 Linux Kernel. Przewodnik programisty
Typowymi mechanizmami eliminującymi hazard wynikający ze współbieżności są se-
mafory i rygle ptlowe (ang. spin lock).
Obszerne omówienie zagadnień synchronizacji i współbieżności znajduje si w roz-
działach 7. oraz 8.
Znaczenie przenośności
Aplikacje użytkowe nie muszą być przenośne. Inaczej jest z samym systemem, który
pomyślany został jako przenośny i taki powinien pozostać. Oznacza to, że kod jądra
pisany w niezależnym sprztowo jzyku C musi dać si poprawnie skompilować i uru-
chomić na wielu różnych platformach.
Zachowanie przenośności umożliwia szereg reguł, takich jak uniezależnienie kodu od
porządku bajtów w słowie, utrzymywanie zgodności z architekturą 64-bitową, nieza-
kładanie rozmiarów słów czy stron i tak dalej. Tematowi przenośności poświcony zo-
stał rozdział 16.
Kompilowanie jądra
Kompilacja jądra jest dość prosta. W rzeczy samej czynność ta jest o wiele prostsza
niż kompilacja i instalacja innych niskopoziomowych elementów systemu operacyj-
nego, jak choćby instalacja biblioteki glibc. Jądra z rodziny 2.6 wprowadzają nowy
system konfiguracji i kompilacji, które jeszcze bardziej upraszczają cały proces.
Przed przystąpieniem do kompilacji jądra należy je wcześniej odpowiednio skonfigu-
rować. Ponieważ jądro oferuje zestaw niezliczonych funkcji i obsługuje całą mas roz-
maitych urządzeń, jest co konfigurować. Opcje konfiguracji reprezentowane są symbolami
rozpoczynającymi si ciągiem , jak w opcji , która reprezentuje
opcj wywłaszczania. Opcje konfiguracyjne mogą być dwu bądz trzywartościowe.
Opcje dwuwartościowe przyjmują wartość włączona (ang. yes) albo wyłączona (ang.
no). Funkcje właściwe jądra takie jak są zwykle konfigurowane jako
opcje dwuwartościowe. Opcja trzywartościowa może przyjąć wartości włączona, wyłą-
czona oraz moduł (ang. module). Ustawienie modułowe oznacza włączenie cechy re-
prezentowanej opcją, ale skompilowanie jej nie bezpośrednio do jądra, a jedynie do
postaci ładowalnego modułu jądra. Do takiej postaci kompilowane są najczściej ste-
rowniki urządzeń.
Kod jądra obejmuje szereg narzdzi służących do automatyzacji procesu konfiguracji.
Najprostszym z tych narzdzi jest konfigurator wiersza polecenia, uruchamiany pole-
ceniem:
Konfigurator ten wyświetla na konsoli seri pytań o wartości kolejnych opcji, pozwala-
jąc wybierać użytkownikowi spośród wartości włączona i wyłączona, ewentualnie (dla
opcji trójwartościowych) wybrać kompilacj do postaci modułu. Ponieważ określenie
Rozdział 1. f& Jądro systemu Linux  wprowadzenie 37
wartości wszystkich kolejnych opcji jest bardzo czasochłonne, użytkownicy, których
wynagrodzenie jest ustalane nie godzinowo, a akordowo, powinni skorzystać z wersji
z interfejsem graficznym wykorzystującym bibliotek ncurses, uruchamianej poleceniem:
W środowisku graficznym X11 można uruchomić w pełni graficzny konfigurator:
Dwa ostatnie konfiguratory uwzgldniają podział opcji konfiguracji na kategorie, na
przykład cechy procesora (kategoria Processor Features) czy urządzenia sieciowe
(Network Devices). Można poruszać si pomidzy kategoriami, przeglądać opcje jądra
i oczywiście zmieniać ich wartości.
Opcje konfiguracyjne przechowywane są w katalogu głównym drzewa katalogów ko-
du zródłowego jądra w pliku o nazwie .config. Niekiedy łatwiej jest przeprowadzić kon-
figuracj jądra rcznie, edytując ten plik bezpośrednio (sposób ten jest preferowany
przez wikszość programistów). W pliku tym można dość łatwo odszukać i zmienić
wartość dowolnej z opcji konfiguracyjnych. Po zakończeniu wprowadzania zmian
(również po skopiowaniu posiadanego pliku konfiguracyjnego do katalogu nowego ją-
dra) można skontrolować i zaktualizować konfiguracj poleceniem:
Zawsze warto uruchomić to polecenie przed rozpoczciem kompilacji jądra. Po usta-
wieniu konfiguracji jądra można przystąpić do jego kompilowania:
W przeciwieństwie do jąder poprzedzających wersj 2.6 nie trzeba już wykonywać
polecenia przed kompilacją jądra  drzewo zależności modułów jest two-
rzone automatycznie. Nie trzeba też już, jak w poprzednich wersjach, określać kon-
kretnego rodzaju kompilacji, jak np. bzImage. Wszystkim zajmuje si domyślna re-
guła pliku Makefile!
Aby zredukować natłok komunikatów towarzyszących kompilacji, pozostawiając so-
bie możliwość oglądania komunikatów ostrzeżeń i błdów, można posłużyć si sztucz-
ką polegającą na przekierowaniu wyjścia programu :
Jeżeli kiedykolwiek po kompilacji zajdzie potrzeba przejrzenia towarzyszących jej
komunikatów, wystarczy zajrzeć do wskazanego pliku. Ponieważ jednak przekiero-
wanie komunikatów nie obejmuje komunikatów o błdach ani komunikatów ostrze-
żeń, potrzeba taka bdzie raczej rzadka.
Skompilowane jądro trzeba zainstalować. Sposób instalacji zależy od architektury sprztu
i konfiguracji programu ładującego  należy przejrzeć wytyczne stosowne dla obecnego
w systemie programu ładującego odnośnie położenia obrazu jądra i sposobu uwzgld-
nienia go w konfiguracji startowej. Warto przy tym uwzgldnić w tej konfiguracji ją-
dro, co do którego istnieje pewność, że działa poprawnie  umożliwi ono urucho-
mienie systemu w przypadku problemów z nowym jądrem.
38 Linux Kernel. Przewodnik programisty
Na przykład, na komputerze o architekturze x86 obsługiwanym przez program ładujący
grub należy skopiować obraz jądra arch/i386/boot/bzImage do katalogu /boot i zmo-
dyfikować plik /etc/grub/grub.conf tak, aby zawierał wpis reprezentujący nowe jądro.
Proces kompilacji obejmuje również utworzenie pliku System.map umieszczanego
w katalogu głównym drzewa katalogów kodu zródłowego jądra. Plik ten zawiera tablic
odwzorowań symboli jądra do ich adresów. Plik ten wykorzystywany jest podczas
diagnostyki, kiedy to służy do tłumaczenia adresów na nazwy funkcji i zmiennych.
Zanim zaczniemy
Niniejsza książka poświcona jest jądru systemu Linux, a w szczególności jego dzia-
łaniu, przeznaczeniu poszczególnych elementów i ich znaczeniu dla systemu operacyj- [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • littlewoman.keep.pl