Mimo że większość kodu w jądrze Linuksa jest napisana w języku C, wciąż istnieje wiele jego części, które są bardzo specyficzne dla platformy, na której są uruchomione i należy to uwzględnić.
Jednym szczególnym przykładem tego jest pamięć wirtualna, która działa w podobny sposób na większości architektur (hierarchia tabel stron), ale ma określone szczegóły dla każdej architektury (takie jak liczba poziomów w każdej architekturze, i to wzrasta nawet na x86 z wprowadzenie nowych większych układów.) Kod jądra Linux wprowadza makra do obsługi przechodzenia przez te hierarchie, które mogą być pomijane przez kompilator w architekturach, które mają mniej poziomów tabel stron (tak, że kod jest napisany w C, ale uwzględnia szczegóły architektury w wynagrodzenie.)
Wiele innych obszarów jest bardzo specyficznych dla każdej architektury i musi być obsługiwanych za pomocą kodu specyficznego dla architektury. Większość z nich wymaga jednak kodu w języku asemblera. Przykładami są:
Przełączanie kontekstu : Przełączanie kontekstu polega na zapisaniu wartości wszystkich rejestrów wyłączanego procesu i przywróceniu rejestrów z zapisanego zestawu procesu zaplanowanego w CPU. Nawet liczba i zestaw rejestrów jest bardzo specyficzna dla każdej architektury. Ten kod jest zwykle implementowany w asemblerze, aby umożliwić pełny dostęp do rejestrów, a także upewnić się, że działa tak szybko, jak to możliwe, ponieważ wydajność przełączania kontekstu może być krytyczna dla systemu.
Wywołania systemowe : Mechanizm, za pomocą którego kod przestrzeni użytkownika może wywoływać wywołanie systemowe, jest zazwyczaj specyficzny dla architektury (a czasami nawet dla konkretnego modelu procesora, na przykład Intel i AMD wprowadziły różne instrukcje, starsze procesory mogą nie mieć tych instrukcji, więc szczegóły dla tych nadal będą wyjątkowe).
Programy obsługi przerwań : szczegółowe informacje na temat obsługi przerwań (przerwań sprzętowych) są zazwyczaj specyficzne dla platformy i zwykle wymagają kleju na poziomie zespołu do obsługi określonych konwencji wywoływania używanych dla platformy. Prymitywy do włączania / wyłączania przerwań są zazwyczaj specyficzne dla platformy i również wymagają kodu asemblera.
Inicjalizacja : szczegółowe informacje na temat tego, jak powinna się odbyć inicjalizacja, zwykle obejmują również szczegóły specyficzne dla platformy i często wymagają kodu instalacyjnego do obsługi punktu wejścia do jądra. Na platformach, które mają wiele procesorów (SMP), szczegółowe informacje na temat przełączania innych procesorów w tryb online są również zależne od platformy.
Blokowanie prymitywów : Implementacja bloków prymitywnych (takich jak blokady) zwykle obejmuje również szczegóły specyficzne dla platformy, ponieważ niektóre architektury zapewniają (lub preferują) różne instrukcje procesora, aby skutecznie je wdrożyć. Niektóre zaimplementują operacje atomowe, niektóre zapewnią cmpxchg, który może atomowo testować / aktualizować (ale nie powiedzie się, jeśli inny program zapisujący wszedł pierwszy), inne będą zawierać modyfikator „blokowania” instrukcji procesora. Często wymagają one również napisania kodu asemblera.
Prawdopodobnie istnieją inne obszary wymagające od platformy kod lub specyficzne dla architektury w jądrze (a konkretnie w jądrze Linux.) Patrząc na drzewie źródłowym jądra, istnieje architektura specyficzne poddrzewa poniżej arch/
i pod include/arch/
którym można znaleźć więcej przykłady tego.
Niektóre są w rzeczywistości zaskakujące, na przykład zobaczysz, że liczba wywołań systemowych dostępnych w każdej architekturze jest osobna, a niektóre wywołania systemowe będą istnieć w niektórych architekturach, a inne nie. (Nawet na x86 lista wywołań systemowych różni się między jądrem 32-bitowym a 64-bitowym.)
Krótko mówiąc, istnieje wiele przypadków, o których jądro musi wiedzieć, które są specyficzne dla platformy. Jądro Linux próbuje wyodrębnić większość z nich, więc algorytmy wyższego poziomu (takie jak zarządzanie pamięcią i planowanie) mogą być zaimplementowane w C i działają tak samo (lub przeważnie tak samo) na wszystkich architekturach.