Podróż do jądra systemu: Tak mocny jest Windows

Windows – to słowo wywołuje całą gamę negatywnych skojarzeń. Według obiegowej opinii sztandarowy produkt Microsoftu jest wyjątkowo słabo zabezpieczony przed armią wirusów zasiedlających Sieć, a jego wydajność jest niezadowalająca: im więcej czasu upływa od instalacji, tym wolniej system działa. Pojawiają się też problemy ze stabilnością: od dawna są nam znane pojęcia “bluescreen” albo “niebieski ekran śmierci”, oznaczające zawieszenie się Windows. Nic dziwnego, że nader często widzimy ten kolor na naszych monitorach, skoro Vistę tworzy przeszło 70 milionów linii kodu – kto by się w tym połapał?
lampa

Podróż do jądra systemu operacyjnego

Czy takie oskarżenia są uzasadnione, czy też to tylko półprawdy i uprzedzenia? Wydanie wyroku nie jest proste – w tym celu trzeba przeniknąć zewnętrzną powłokę systemu i obejrzeć z bliska jego jądro (ang. kernel). Ocenimy je według trzech kryteriów: bezpieczeństwo, wydajność oraz stabilność. Przy okazji porównamy jądro stworzone przez Microsoft z konkurentami: Linuksem i Mac OS X. Ponadto szczegółowo przedstawimy rozwiązania techniczne zastosowane w opisywanych systemach.

Kernel: serce systemu

Zadaniem jądra jest sterowanie działaniem systemu operacyjnego. Dlatego jego jakość w znaczący sposób wpływa na sprawność działania całego peceta. To właśnie jądro utrzymuje wszystko w ruchu, ponieważ zawiera sterowniki sprzętu umożliwiające komunikację z urządzeniami zewnętrznymi oraz moduły zarządzające komponentami komputera, takimi jak pamięć operacyjna, procesor czy dysk twardy.

Jądro dba także o bezpieczne działanie systemu, śledząc wszystkie uruchomione procesy. Nadaje też uruchomionym programom prawo do korzystania z urządzeń sprzętowych przez określony czas. Dla zachowania stabilności najważniejsza jest odpowiednia organizacja zasobów, obejmująca funkcje, z których korzystamy na co dzień, m.in. zarządzanie systemem plików.

Wysoka sprawność jądra jest także niezbędna do szybkiego rozwiązywania konfliktów dostępu występujących na przykład wtedy, gdy wiele programów chce jednocześnie zapisać dane na dysku. W takich sytuacjach kernel nadaje aplikacjom określony priorytet, pozwalając jednemu z programów na zapis, a innym nakazując oczekiwanie na swoją kolej. W dalszej części tekstu bardziej szczegółowo opisujemy, jak Windows radzi sobie z tymi wszystkimi zadaniami.

Windows: na każdym komputerze

Od czasu wprowadzenia linii systemów NT w architekturze Windows istnieje podział na tryb jądra oraz tryb użytkownika – dotyczy to również Visty. W trybie użytkownika działa właściwie wszystko, co widzimy, korzystając z komputera, a więc programy takie jak Word czy Photoshop. Aplikacje działające w tym trybie nie mają bezpośredniego dostępu do komponentów sprzętowych i pamięci operacyjnej. Można powiedzieć, że tryb użytkownika Windows jest pokryty otuliną. Dojścia sięgające bardziej w głąb systemu są kierowane przez odpowiedni interfejs programowy, np. Win32 API korzystający z bibliotek systemowych DLL.

Tryb jądra działa natomiast w tle, a użytkownik dowiaduje się o jego istnieniu tylko wtedy, kiedy pojawia się poważny problem. Na przykład w sytuacji, gdy nieprawidłowe działanie sterownika funkcjonującego w trybie jądra (patrz infografika po prawej) doprowadzi do zawieszenia się systemu, na ekranie pojawi się niebieski ekran śmierci.

Centralną pozycję w systemie Windows zajmuje plik “ntoskrnl.exe”. Aby obsłużyć tryb jądra i tryb użytkownika, funkcjonuje on dwutorowo, obejmując warstwę jądra i tzw. egzekutor. Warstwa jądra łączy tryb użytkownika i tryb jądra, a jej głównym zadaniem jest przydzielanie poszczególnym programom i procesom określonej ilości czasu procesora (ang. CPU-scheduling). Egzekutor z kolei obejmuje zakresem działania usługi systemowe, np. Plug&Play.

Najgłębiej w systemie znajduje się tzw. abstrakcyjna warstwa sprzętowa (HAL: Hardware Abstraction Layer). O co chodzi? Architektury poszczególnych pecetów bardzo się różnią. Jednak za sprawą HAL od strony jądra wszystkie wyglądają tak samo. Dzięki temu kernel może przydzielać czas procesora niezależnie od tego, czy dany układ ma dwa rdzenie i został wyprodukowany przez AMD, czy też jest czterordzeniowy i pochodzi od Intela.

Generalnie zadaniem HAL jest przystosowanie – za pomocą odpowiednich usług – pozostałych elementów architektury systemu do konkretnej konfiguracji sprzętowej komputera. Bez abstrakcyjnej warstwy sprzętowej Microsoft musiałby tworzyć oddzielne wersje systemu operacyjnego dla każdego komputera z osobna.

Linux: system na miarę

Architektura Linuksa jest oparta na systemie Unix, jednak jest on znacznie bardziej podobny do Windows, niż mogłoby się wydawać. Również w tym wypadku jądro znajduje się najbliżej warstwy hard-ware’owej i odgrywa rolę pośrednika między sprzętem a uruchomionymi aplikacjami. W klasycznych zastosowaniach prawie nie widać różnicy: dokładnie tak samo jak jądro Windows, kernel Linuksa współpracuje z urządzeniami wejścia/wyjścia i zarządza pamięcią. Inny obszar jego działania to zarządzanie procesami, a więc ustalanie, które zadanie ma w danym momencie najwyższy priorytet, tzn. prawo do korzystania z czasu procesora.

Ponadto w najniższej warstwie jądra Linuksa znajdują się funkcje sterowania przerwaniami. Żądanie przerwania jest wysyłane na przykład wtedy, kiedy wciskamy przycisk na klawiaturze. Zostaje ono przetworzone przez specjalny mechanizm systemowy – tzw. dyspozytor (ang. dispatcher) – który określa, jak wysoki jest priorytet żądania i dołącza je do uruchomionych procesów. Gdy tylko przerwanie może zostać wykonane, dyspozytor zatrzymuje przebiegający w danej chwili proces, zapisuje jego stan i wywołuje program do obsługi wciśniętego klawisza. Dzięki temu polecenia wpisane z klawiatury są przetwarzane tak szybko, jak to tylko możliwe.

Podobnie jak Windows, Linux ma jądro o strukturze monolitycznej (patrz ramka “Przegląd typów jąder”), jednak w odróżnieniu od konkurenta kernel Linuksa może dynamicznie uruchamiać dodatkowe moduły uzupełniające lub całkowicie zastępujące standardowe komponenty. W jego skład wchodzą również interfejsy obsługujące wywołania systemu i bibliotek oraz interfejs użytkownika. Szczególnie ważną rolę pełni moduł wywołań systemu, odpowiedzialny za obsługę uruchomionych procesów. Korzystając ze specjalnych instrukcji, przełącza on procesy działające w trybie użytkownika na tryb jądra.

OS X: siła dwóch jąder

Jądro systemu Mac OS X jest znane pod nazwą XNU, będącą akronimem zdania “X is Not Unix”. Określenie to jest uzasadnione, gdyż programiści Apple’a połączyli dwa systemy, z których tylko jeden należy do wielkiej rodziny Uniksa (patrz infografika “Jądro OS X”). Drugim przodkiem Mac OS-u jest projekt Mach – typowy przykład mikrojądra (patrz ramka “Przegląd typów jąder”). Nie został on jednak wykorzystany jako kernel sam w sobie, ale jako element służący do efektywnej komunikacji między poszczególnymi częściami jądra. W skład struktury XNU wchodzi też kod pochodzący z bazującego na Uniksie projektu FreeBSD, odpowiadający za zarządzanie prawami użytkowników, przetwarzanie sygnału i kompatybilność z POSIX, standardem zapewniającym zgodność aplikacji uniksowych z Mac OS X.

Ważnym komponentem pochodzącym z systemu Mach jest tzw. I/O Kit, przetwarzający informacje na wejściu i wyjściu. To jeden z elementów odróżniających Mac OS X od konkurentów, stanowiący dodatkowy poziom pomiędzy warstwą sprzętową a oprogramowaniem. W skład I/O Kit wchodzą standardowe modele sterowników, które programiści dostosowują do konkretnych urządzeń. Dzięki takiemu rozwiązaniu uzyskuje się większą stabilność i wydajność systemu.

Poza standardowymi usługami jądro Mac OS X oferuje możliwość dynamicznego ładowania dodatkowych rozszerzeń zgodnie z aktualnymi potrzebami systemu. Z tego powodu jest ono czasem zaliczane do jąder hybrydowych, choć eksperci, wskazując na jego architekturę, kwalifikują je raczej do grupy monolitów.

Procesy: bezpieczne podpisy

Ważnym zadaniem jądra systemowego jest zarządzanie procesami. Kryje się za tym nie tylko nadawanie poszczególnym zadaniom odpowiednich priorytetów, ale też ich zabezpieczanie. W systemie Windows uruchamianiem i kontrolowaniem procesów zajmuje się Win32 API. Częścią jądra odpowiedzialną za ten rodzaj zadań jest egzekutor warstwy wykonawczej NT. Procesy mogą uzyskać dostęp do komponentów jądra dzięki tzw. uchwytom (ang. handles).

Windows pozwala też procesom na uruchamianie kolejnych procesów, np. Word (proces 1) może utworzyć nowy dokument (proces 2). Klasyczny model procedur Windows umożliwia także edytorowi tekstu wprowadzanie zmian w utworzonym dokumencie lub jego usuniecie. Krótko mówiąc, procesy macierzyste mają kontrolę nad tymi procesami, które utworzyły.

Istnieje jednak furtka pozwalająca zwykłym procesom obejść hierarchię dostępu. Jest nią tryb debugowania programów, dający użytkownikowi posiadającemu uprawnienia administratora pełny dostęp do dowolnego procesu. Użytkownik może w ten sposób sprawdzić pulę adresów wykorzystywanych przez proces, a także odczytać bądź zmienić przetwarzane przez niego informacje. Korzystając z tej funkcji, haker jest w stanie wprowadzić do procesu nowe wątki.

Żeby zabezpieczyć użytkownika przed tym rodzajem ataku, w Viście zastosowano nowy typ procesu, przeznaczony głównie do aplikacji multimedialnych – proces chroniony. Cechuje go silne ograniczenie praw do zarządzania innymi procesami. System przygotowuje informacje diagnostyczne dla procesów chronionych, ale nawet administratorzy nie mogą uzyskać do nich bezpośredniego dostępu. Program, np. kodek do odtwarzania filmu, może zostać uruchomiony jako proces chroniony tylko pod warunkiem, że jego kod został opatrzony podpisem cyfrowym. Wprowadzenie procesów chronionych to idealny przykład, jak Microsoft dopasowuje nieco już przykurzoną architekturę Windows do aktualnych wymagań.

W systemach Linux i Mac OS X model obsługi procesów jest podobny jak w Windows: procesy nadrzędne mają pod kontrolą procesy potomne. Systemy te umożliwiają więc użytkownikom klasy Root samodzielne analizowanie procesów i ingerowanie w ich przebieg. Brakuje jednak odpowiednika procesów chronionych. Nic dziwnego – celem Microsoftu było przede wszystkim przystosowanie Visty do obsługi DRM, czyli cyfrowego zarządzania licencjami treści multimedialnych, czego projektanci Linuksa i Mac OS X nie brali pod uwagę.

ASLR: ukrywanie adresów pamięci

Szerokość szyny danych w nowoczesnych procesorach wynosi 64 bity, przy czym niektóre z nich odpowiadają za wykonywanie wstępnie określonych zadań. Przykładowo bit NX jest przeznaczony do obsługi systemu ochrony przed uruchomieniem pliku (Data Execution Prevention). Podczas próby wykonania kodu znajdującego się na stronie pamięci oznaczonej jako “nie wykonywać” pojawia się błąd. System Windows nie pozwala na wyłączenie technologii DEP w 64-bitowych programach i sterownikach, ale wciąż powszechnie stosowane aplikacje 32-bitowe nie gwarantują tego rodzaju ochrony. Wystawia to użytkownika na niebezpieczeństwo ataku polegającego na przepełnieniu bufora danych. W ten sposób haker może zainfekować procesy takie jak Internet Explorer, co skutecznie ograniczy wydajność komputera. Gdy szkodnik zagnieździ się w systemie, może wykorzystać interfejs Win32 API, by odczytać nasze dane lub zmienić konfigurację Windows.

By zabezpieczyć się przed takim zagrożeniem – częściowo już w SP2 do Windows XP, a w pełni funkcjonalnie w Windows Vista – zaimplementowano funkcję ochrony jądra: Address Space Load Randomization. ASLR, czyli losowe przydzielanie adresu pamięci, powstało na podstawie obserwacji działań hakerów: rozpoczynają oni atak od bibliotek DLL, które we wcześniejszych wersjach Windows były każdorazowo ładowane do tego samego miejsca w pamięci. ASLR podczas każdego uruchomienia komputera umieszcza systemowe pliki DLL i pliki wykonywalne w innej lokalizacji, co uniemożliwia złośliwym programom dostęp do procesów systemu poprzez standardowe adresy pamięci. Podczas ładowania biblioteki DLL Menedżer pamięci losowo wybiera miejsce zapisu spośród 256 możliwych. Dodatkową zaletą strategii wykorzystywanej przez ASLR jest to, że pule adresów są w porównaniu z wcześniejszymi wersjami systemu Windows gęściej upakowane, co pozwala na uzyskanie większej ilości niepofragmentowanej pamięci.

Również niektóre dystrybucje Linuksa, np. wzmocnione Gentoo, są już wyposażone w funkcję ASLR. Standardowe jądro Linuksa zawiera jednak tylko częściową implementację tego rozwiązania, którą użytkownik musi uzupełnić samodzielnie. Aktualna wersja Mac OS X wykorzystuje ASLR do zabezpieczania niektórych bibliotek, lecz również tu brakuje pełnej ochrony.

Tym, co spędza sen z oczu ekspertom od bezpieczeństwa, są rootkity trybu jądra. Działają one na tym samym poziomie uprawnień co jądro, dlatego nie da się zwalczać ich zwykłym oprogramowaniem antywirusowym. Szkodnik zwykle zagnieżdża się w jądrze, udając sterownik, a następnie ingeruje w pracę kernela i sterowników tak, że sam rootkit nie jest widoczny.

Sprawdzenie integralności: bezpieczne programy

Środkiem zabezpieczającym przed rootkitami jest opracowany przez Microsoft system podpisywania instrukcji trybu jądra – Kernel Mode Code Signing — pozwalający na instalowanie tylko tych sterowników, które są podpisane cyfrowo. Sygnatury są zwykle nadawane przez Laboratorium Jakości Sprzętu Windows (WHQL – Windows Hardware Quality Lab), choć programiści mogą podpisywać napisane przez siebie instrukcje samodzielnie.

W tym celu autor kodu musi przypisać swemu programowi cyfrowy odcisk palca, czyli tzw. hasz, podpisać go kluczem prywatnym i wprowadzić certyfikat oraz zaszyfrowaną wartość kontrolną do kodu źródłowego. Podczas próby instalacji sterownika, Windows za pomocą klucza w certyfikacie odczytuje ukrytą wartość hasz i sprawdza, czy pasuje ona do programu. Kontrolowana jest też zgodność załączonego do sterownika certyfikatu z wzorami umieszczonymi w programie rozruchowym oraz w jądrze systemu operacyjnego. Niestety, w odróżnieniu od wersji 64-bitowej, 32-bitowa Vista dopuszcza instalację sterowników niepodpisanych cyfrowo.

W Mac OS X i w Linuksie cyfrowo podpisywane są dodatkowe moduły jądra. Teoretycznie da się w ten sposób zabezpieczać również sterowniki, jednak systemy nie dysponują narzędziami do sprawdzania ich autentyczności.

MMCSS: filmy mają pierwszeństwo

Harmonogram systemu Windows zarządza wszystkimi uruchomionymi procesami. Każdy z nich może wykorzystać określoną ilość czasu procesora, po upływie którego przechodzi w tryb oczekiwania. Oczywiście żaden użytkownik nie lubi sytuacji, w których odtwarzacz przełącza się na czekanie w najbardziej emocjonującym momencie filmu. Dlatego Microsoft wprowadził w swoim systemie specjalną usługę zapewniającą szybką obsługę multimediów. Dzięki Multimedia Class Scheduling Service działające w tle programy czy skaner antywirusowy nigdy nie zepsują nam przyjemności z oglądania filmów bądź słuchania muzyki.

Przed skorzystaniem z usługi MMCSS aplikacja multimedialna, np. Media Player, musi się w niej zarejestrować. Usługę, która obejmuje wątek zarządzania priorytetami, zaimplementowano w bibliotece “Mmcss.dll”. System Windows umożliwia określenie ważności procesu w przedziale od 0 do 31, przy czym MMCSS ma priorytet 27, który uzyskują też wszystkie zarejestrowane aplikacje multimedialne. Jest to wysoka wartość – procesy o priorytecie powyżej 16 są obsługiwane w czasie rzeczywistym, co oznacza, że inne procesy nie mogą przeszkadzać w ich wykonywaniu. Opisywana usługa dba też o to, by nie “zagłodzić” mniej ważnych programów – przy aktywnym MMCSS Windows automatycznie rezerwuje pewien procent czasu procesora na inne zadania.

Linuks umożliwia jeszcze dokładniejsze określanie priorytetu: od 0 do 99, dzięki czemu system lepiej spisuje się w zastosowaniach multimedialnych, np. jako domowy serwer mediów. W Mac OS X została wykorzystana usługa szeregowania znana z systemu Mach. Jest on nowocześniejszy niż konkurenci, o czym świadczy nie tylko szeroki zakres możliwych poziomów ważności (od 0 do 127), ale też możliwość przydzielenia aplikacji multimedialnej stałego udziału w czasie procesora. Jeśli tylko dysponujemy odpowiednio szybkim komputerem, pozwala to praktycznie całkowicie wyeliminować wąskie gardła.

Wejście/Wyjście: szeregowanie zadań

To, co przypadnie do gustu kinomanom, niekoniecznie musi się sprawdzić w pracy z wieloma aplikacjami jednocześnie. W Windows XP duże problemy sprawiają usługi działające w tle, np. automatyczny defragmentator. Co prawda, zapewnia on porządek na dysku, ale co z tego, skoro musimy bardzo długo czekać, aż programy zareagują na polecenia myszy.

Płynną pracę zapewni nam szeregowanie zadań wejścia i wyjścia. W Viście programy działające na pierwszym planie zawsze mają pierwszeństwo – defragmentator musi cierpliwie czekać, aż użytkownik zrobi sobie przerwę. System obsługi wejścia/wyjścia wyróżnia pięć poziomów ważności: od “bardzo niskiego” poprzez domyślny “normalny” aż do “krytycznego”. Usługom działającym w tle Windows automatycznie nadaje niski priorytet, z kolei Menedżer pamięci jest zawsze procesem krytycznym – jeśli zabraknie pamięci operacyjnej, musi on natychmiast przenieść jej zawartość na dysk.

Polecenia pochodzące od sterowników wejścia/wyjścia, np. ruchy myszki, mają średni priorytet i czekają na obsłużenie w kolejce. Programy mogą ponadto zarezerwować określoną szerokość pasma transmisyjnego wejścia/wyjścia dla swoich potrzeb – w  ten sposób odtwarzacz multimedialny uzyskuje gwarancję, że film zapisany na płycie DVD będzie odtwarzany bez opóźnień. Pozostałe operacje wejścia/wyjścia są obsługiwane tylko wtedy, gdy wystarcza na to czasu procesora.

To, co w Viście jest nowością, w świecie Linuksa i Mac OS X znane jest od dawna. Mac OS do przekazywania informacji wykorzystuje Mach, dzięki czemu podobna funkcja jest integralnym elementem jego architektury. Jądra Linuksa zapewniają efektywne szeregowanie zadań od wersji jądra 2.6.

Adresy: dynamiczne przydzielanie

32-bitowa architektura procesorów powoduje znaczne ograniczenie zakresu adresów pamięci operacyjnej. Z tego powodu jądro systemu Windows nie może być większe niż 2 GB, a przecież musi jeszcze wystarczyć miejsca na sterowniki, pamięć podręczną oraz stos systemu plików. W Windows XP Menedżer pamięci już przy starcie określa, ile miejsca zostanie przydzielone poszczególnym komponentom.

Okazuje się, że nie jest to najlepsze rozwiązanie: często, gdy pamięć podręczna pęka w szwach, stos ma jeszcze sporo miejsca, którego nie może jednak oddać. Dlatego w Viście zastosowano dynamiczny podział zakresu adresów pamięci jądra. Odpowiednia usługa kontroluje zwalnianie i przydzielanie zasobów w zależności od chwilowego zapotrzebowania. Dzięki temu pamięć wirtualna może być powiększana w sytuacji, gdy rosną potrzeby sterowników, i zmniejszana, gdy nie jest w pełni wykorzystana.

W Linuksie i Mac OS X nie są stosowane stałe ograniczenia. Tu również jest ustalona maksymalna wielkość jądra, jednak objętość jego poszczególnych komponentów może się zmieniać – w przeciwieństwie do Windows alternatywne systemy nie wprowadzają ścisłego podziału na pamięć jądra i pamięć sterowników.

KTM: przeciwdziałanie skutkom zawieszania się aplikacji

Chcąc przeprowadzić sekwencję powiązanych ze sobą zmian, program może skorzystać z Menedżera transakcji jądra (KTM — Kernel Transaction Manager) i  przeprowadzić transakcję, wykorzystując Koordynator transakcji rozproszonych (DTC — Distributed Transaction Coordinator), albo też użyć tylko KTM, a następnie przyporządkować wszystkie zmiany w plikach i kluczach Rejestru do jednej transakcji. Jeśli instalacja przebiegnie prawidłowo, modyfikacje są wprowadzane – do tego momentu można je w każdej chwili cofnąć. Inne aplikacje widzą przeprowadzone zmiany dopiero po zakończeniu procesu transakcji.

Mac OS X i Linux również korzystają z mechanizmu transakcji. Użytkownik zwykle o niczym nie wie, chyba że aktualizacja przestanie odpowiadać. W takiej sytuacji nie ma jednak żadnego zagrożenia dla stabilności systemu – zostaje jedynie wyświetlony komunikat informujący, że zmiany nie zostały wprowadzone.

Podsumowanie:

W porównaniu z Linuksem i Mac OS X kernel Windows wypada bardzo dobrze. Co prawda, architektura konkurentów jest nieco młodsza, wywodzi się jednak ze starego Uniksa. Chronione procesy czy cyfrowe podpisywanie modułów jądra są przykładami udanego dostosowania przestarzałej struktury Windows do współczesnych wymagań w zakresie bezpieczeństwa.

Niestety, wiele z opisywanych funkcji działa jedynie w środowisku 64-bitowym i nie zostało przystosowanych do wciąż popularnego Windows XP. Dodajmy, że w przypadku Linuksa i Mac OS X można zrezygnować z zaawansowanych usług ochronnych takich jak ASLR, gdyż systemy te nie są tak często atakowane przez hakerów i złośliwe oprogramowanie. Uzyskanie uprawnień administracyjnych przez napastnika jest przy tym wciąż łatwiejsze w Windows niż w konkurencyjnych OS-ach.

Produkt Microsoftu wciąż mocno tkwi w przeszłości – w Viście pojedynczy sterownik nadal może zablokować cały system. Znacznie nowocześniejszy jest Mac OS X, któremu wysoką wydajność gwarantuje zastosowanie komponentów Mach w komunikacji między elementami jądra oraz obsługa operacji wejścia/wyjścia przez I/O Kit. Za wyborem Linuksa przemawia jego otwartość: każdy może dopasować kernel do swoich potrzeb – oczywiście pod warunkiem że wie, co robi.

Architektura Windows

W codziennej pracy użytkownik w ogóle nie widzi wielu elementów systemu operacyjnego stworzonego przez Microsoft. W normalnej pracy wykorzystuje się tylko aplikacje pracujące w trybie użytkownika, zaś tryb jądra, w którym system porozumiewa się z komputerem, pozostaje ukryty.

Jądro Windows

Zasoby systemu NT, serce jądra Windows, są podzielone logicznie na dwie warstwy. Jedna osobliwość: sterowniki mogą z powodów związanych z wydajnością odwoływać się bezpośrednio do sprzętu.

Debugowanie
WINDBG

Chcąc przeanalizować treść niebieskiego ekranu, potrzebujemy debugera, np. WinDbg. Na stronie pobierania należącej do Microsoftu znajdziemy objaśnienia parametrów wykorzystywanych przez program.
Info: www.microsoft.com/whdc/devtools/debugging

NOTMYFAULT

To narzędzie sprawdza wytrzymałość naszego systemu, wywołując błąd i celowo doprowadzając do zawieszenia się Windows. Eksperymentujmy z nim ostrożnie!
Info: download.sysinternals.com/Files/Notmyfault.zip

PROCESS EXPLORER

Zarządzanie procesami jest jednym z głównych zadań systemu operacyjnego. Process Explorer wyciąga procesy na światło dzienne i pokazuje związki między nimi, a także wykorzystywane przez nie uchwyty.
Info: technet.microsoft.com/en-us/sysinternals/bb896653.aspx

Przegląd typów jąder
Monolityczne

Idea monolitu jest prosta: duży rdzeń do wszystkich zadań. Potrafi on zarządzać pamięcią i procesami, obsługiwać komunikację między aplikacjami i oferuje wsparcie dla sterowników oraz sprzętu. Do tej kategorii należą kernele systemów Windows, Linux i Mac Os X.

Mikrojądro

Błąd operacji w jądrze może zatrzymać pracę całego systemu. Dlatego – aby zmniejszyć ryzyko błędów i zawieszania się komputera – mikrojądra są małe. Obsługę wielu zadań umożliwiają liczne moduły, na które podzielony jest kernel, jednak tylko jeden z nich pracuje w trybie jądra. Typowym przykładem jest system operacyjny Mach (opracowany na amerykańskim uniwersytecie Carnegie Mellon), który wykorzystali twórcy Mac OS X. Do tej pory nie został stworzony system operacyjny do zastosowań domowych bazujący na mikrojądrze.

Hybrydowe

Połączenie elementów monolitu i mikrojądra to tzw. jądro hybrydowe. Kernel jest odchudzony, za to możliwe jest dynamiczne dołączanie wyspecjalizowanych modułów do wykonywania nietypowych zadań. Linux i Mac OS X umożliwiają, co prawda, rozszerzanie możliwości kernela w taki sposób, jednak nie jest to wykorzystywane w wystarczająco dużym stopniu, by można było zaliczyć jądra tych systemów do grupy hybryd.

Jądro Linuksa 

Kernel Linuksa odpowiada za sterowanie poleceniami wejścia i wyjścia. Zarządza również pamięcią operacyjną oraz procesami. Na najniższym poziome znajdują się struktury sterujące dostępem procesów do czasu procesora.

Jądro OS X

Kernel Mac Os X to połączenie dwóch grup elementów: podsystemów pochodzących z bazującego na Uniksie systemu BSD oraz części mikrojądra Mach.

Windows 7, 8, 9…

Następca Visty, Windows 7, pojawi się prawdopodobnie w 2010 roku. Oznacza to zbyt mało czasu na gruntowną odnowę systemu. Nie jest jednak tajemnicą, że Microsoft pracuje nad dwoma projektami przebudowy architektury Windows, z których ma się wyłonić system operacyjny przyszłości.

Singularity ma być systemem, który nie będzie się zawieszał. Składają się nań trzy najważniejsze elementy: Software Isolated Processes (SIP), czyli procesy izolowane programowo, mikrojądro oraz kanały. Mikrojądro będzie obsługiwało tylko najbardziej kluczowe funkcje: zarządzanie pamięcią i procesami, sterowanie kanałami, szeregowanie zadań oraz obsługę wejścia i wyjścia. Wszystkie pozostałe usługi zostaną umieszczone w osobnych modułach i będą realizowane jako wydzielone procesy SIP. Kanały umożliwią komunikację pomiędzy SIP-ami oraz mikrojądra z SIP-ami.

Midori wybiega daleko w przyszłość i składa się z jądra modularnego. Wyłącznie elementy najbliższe warstwie sprzętowej będą napisane w języku C lub w Asemblerze, zaś wszystkie pozostałe komponenty projektu Microsoft chce zbudować na platformie.NET. Zaletą tego rozwiązania będzie lepsza praca Windows na różnych platformach, np. netbookach, palmtopach czy telefonach komórkowych.