osdev.labedz.org

Co jest celem tej strony?

Celem tej strony jest pokazanie od podstaw procesu implementacji prostego systemu operacyjnego w jak najprostrzy sposób. Oczywiście nie będziemy budować żadnego profesjonalnego systemu. Prawdopodobnie nie będzie on też mocno rozbudowany - wystarczy że będą działać podstawowe bloki systemu :)

Założenia - czyli prosto i przyjemnie ...

Aby główny warunek mógł być spełniony, implementowany system operacyjny musi charakteryzować się szeregiem właściwości, które w zastosowaniu ogólnym nie koniecznie muszą być spełnione lub wręcz mogą być niesłuszne. Przede wszystkim warto w systemie zamieścić podstawowe mechanizmy SO. Do mechanizmów zaliczyć należy menadżera procesów, zarządzającego tworzeniem, szeregowaniem, przełączaniem i likwidowaniem procesów, menadżera pamięci niskopoziomowej, którego zadaniem jest rezerwowanie dowolnej wielkości bloków pamięci, zwracanie ich adresu liniowego, oraz zwalniania wcześniej zarezerwowanego obszaru, menadżera obsługi wyjątków i przerwań obsługującego ewentualne błędy programowe i reagującego na żądania obsługi od podstawowych urządzeń zewnętrznych, oraz mechanizm wywołań systemowych umożliwiający wywoływanie procedur o wyższym poziomie uprzywilejowania z poziomu procedur aplikacji. Jak będzie czas to się pokusimy o następne mechanizmy.

Kolejnym ważnym założeniem, które musi być spełnione, jest jego prosta budowa. Problem ten dotyczy nie tylko struktury samego systemu i odpowiednio czytelnego kodu, ale także zastosowaniem właściwej liczby komentarzy czy samej konstrukcji drzew katalogów z plikami zawierającymi kod systemu.

Pytanie: w czym?

W celu zachowania odpowiedniego poziomu zrozumienia plików źródłowych implementowanego systemu, większość z nich powinna być napisana w najbardziej powszechnym języków wysokiego poziomu - C. Jest to język najbardziej sformalizowany (istnieje międzynarodowa norma ściśle go określająca - ISO), bardzo powszechny, wygodny i efektywny. Oczywiście assemblera się nie uniknie, więc kod niezbędnych wstawek powinien być zaopatrzony w odpowiednią liczbę komentarzy.

Struktura drzew katalogów zawierającymi pliki źródłowe powinna być w taki sposób zaprojektowana, aby odnalezienie interesującej nas procedury nie sprawiało większych problemów. Kod źródłowegy jest podzielony na część dotycząca jądra samego systemu operacyjnego, część dotycząca niezbędnych bibliotek języka C, oraz część dotycząca programów aplikacji. Części logiczne kodu źródłowego jądra systemów, takie jak operacje dotyczące trybu chronionego procesora, procedury obsługi portów wejścia/wyjścia i urządzeń zewnętrznych, procedury dotyczące mechanizmu obsługi pamięci, czy też przerwania i wywołania systemowe są również oddzielone - pliki ich dotyczące znalezły się w oddzielnych katalogach. Aby ułatwić dostęp do kodu źródłowego poszczególnych procedur, najlepszym wyjściem jest umieszczenie ich w oddzielnych plikach źródłowych o nazwie odpowiadającej identyfikatorowi procedury.

Jak się zabrać do implementacji?

Proces implementacji prostego systemu operacyjnego może być pokazany praktycznie w dwojaki sposób: poprzez implementację nowego systemu operacyjnego od podstaw, lub też opis istniejącego systemu wraz ze sposobami jego modyfikacji. Mimo, że oba sposoby mogą dać doskonałe efekty, za wyborem pierwszego rozwiązania przemawia wiele przekonywujących faktów. Najważniejszym z nich jest cecha chyba większości ludzi: wiedza z każdej dziedziny jest wtedy najlepiej przyswajalna, kiedy możemy ją poprzeć praktycznym działaniem. Ta teza dotyczy również implementacji systemu operacyjnego - mimo, że prawdopodobnie pierwszy zaimplementowany system będzie obarczony wieloma błędami i nie ma co myśleć o konkurowaniu w żaden sposób z tymi dostępnymi już na rynku, to jednak doświadczenie nabyte w trakcie jego projektowania i pisania dostarczy na pewno więcej wiedzy niż wielomiesięczna, teoretyczna analiza książek dotycząca tego tematu.

Robimy swój od początku, czy może przerobić coś innego?

Drugim faktem przemawiającym za tym, że w ramach nauki o systemach operacyjnych warto jest zająć się implementacją systemu od podstaw, jest to, że analiza istniejącego już systemu operacyjnego i poznanie go na tyle, aby istniała możliwość jego modyfikacji, zabiera bardzo dużo czasu, i nie zawsze jest wykonalne. Dzieje się tak przede wszystkim dlatego, iż większość obecnie tworzonych i rozwijanych systemów jest projektowana jako systemy całkowicie użytkowe, czyli charakteryzujące się dużą efektywnością i złożonością. Poprzez to, ich kod źródłowy jest mocno skomplikowany poprzez liczne zabiegi optymalizacyjne oraz bardzo duży narzut kodu nadmiarowego (istnienie wiele procedur wykonujących tą samo operację na trochę inne sposoby np. rodzina procedur printf; wiele procedur pozostawionych w celu uzyskania zgodności z poprzednimi wersjami systemu; obsługa wielu urządzeń nierzadko nieobecnych w systemie komputerowym itp.).

Kolejnym powodem, który w znaczny sposób zniechęca do poznawania istniejącego już systemu jest częsty brak dobrej dokumentacji takiego programu. Najczęściej systemy operacyjne zawierają lakoniczne opisy funkcji procedur (a nie sposobu ich działania), zazwyczaj w języku angielskim. Częsty jest jednak również fakt braku jakiegokolwiek opisu danego systemu operacyjnego.

Nie tylko ta strona...

Oczywiście, przed rozpoczęciem procesu implementacji systemu operacyjnego należy się zapoznać zarówno z fachową literaturą dotyczącą tego zagadnienia, jak również przyjrzeć się niektórym rozwiązaniom zastosowanym w obecnie istniejących systemach. Niewyczerpalnym źródłem wiedzy jest oczywiście Internet, na którego to forum działa bardzo wiele programistów-hobbystów zajmujących się tym zagadnieniem zazwyczaj dla przyjemności i którzy bardzo chętnie dzielą się owocami swojej pracy. Mimo traktowania tego tematu w sposób rozrywkowy, często okazuje się, że ludzie ci to światowej sławy specjaliści w tej dziedzinie, a efektem ich pracy jest powstanie wielu profesjonalnych narzędzi, w tym również wiele systemów operacyjnych.