Jestem bardzo ambitnym studentem uniwersytetu, który chce nauczyć się prawie wszystkiego, co trzeba wiedzieć o komputerach (zadzierajcie ze mną, jeśli chcesz, uwielbiam się uczyć). Ostatnio pomyślałem, że zaprojektowanie i zbudowanie własnego jądra byłoby zabawnym (choć długim) projektem.
Dostałem kilka podstawowych informacji i zebrałem, że muszę opanować Assembly i C / C ++, aby naprawdę zadziałało. Podczas gdy nad nimi pracuję, chciałbym dowiedzieć się, JAK jądro faktycznie działa z perspektywy programowania. Spędziłem godziny przeglądając kod jądra Linuksa, ale jak na razie to może cię zabrać.
Jakie są podstawowe kroki w budowaniu jądra? Co musisz rozwiązać? Zamówić lub robić rzeczy? Wiem, że dużo gryzę, ale jestem wystarczająco zdeterminowany, aby sobie z tym poradzić.
Odpowiedzi:
To, co musisz zrobić, to zaprojektować system operacyjny. Nawet jeśli na przykład zdecydujesz, że powinien to być system podobny do systemu UNIX, wciąż musisz podjąć wiele decyzji. Jak bardzo chcesz mieć UNIX? Które części UNIXa lubisz i które według ciebie wymagają poprawy?
Jeśli nie jesteś nastawiony na to, że jest podobny do systemu UNIX, otrzymasz jeszcze więcej pytań, na które odpowiesz: czy procesy powinny tworzyć drzewo, czy też są „płaskie”? Jakie rodzaje komunikacji między procesami chcesz wspierać? Czy chcesz, aby był wielozadaniowy, czy tylko wielozadaniowy (a może jednozadaniowy)? Czy chcesz, aby był to system czasu rzeczywistego? Jaki stopień izolacji chcesz zapewnić między zadaniami? Gdzie chcesz, aby spadał w skali monolitycznej vs. mikrojądra? W jakim stopniu (jeśli w ogóle) chcesz, aby wspierał on operację rozproszoną?
Ja zazwyczaj doradzają przed studiowania jądra dla inspiracji. To nic przeciwko samemu jądru Linuksa, ale prosty fakt, że Linux jest przeznaczony głównie do użytku produkcyjnego, a nie edukacyjnego. Ma wiele optymalizacji, włamań do kompatybilności wstecznej itp., Które są niezwykle przydatne w produkcji, ale bardziej rozpraszają niż edukują.
Jeśli możesz go znaleźć, kopia książki Lwa ( Komentarz Lionsa do UNIX 6th Edition , z kodem źródłowym , autorstwa Johna Lionsa) jest znacznie łatwiejszym punktem wyjścia. 6. edycja UNIX był wciąż mały i wystarczająco prosty, aby czytać i rozumieć dość szybko, nie będąc nadmiernie uproszczonym systemem zabawek.
Jeśli planujesz wycelować w x86 (przynajmniej przede wszystkim), możesz także spojrzeć na MMURTL V 1.0 autorstwa Richarda Burgessa. Prezentuje to system dla x86, który wykorzystuje sprzęt x86 w znacznie większym stopniu, niż pierwotnie zamierzali projektanci CPU - coś, co najbardziej realne systemy unikają przenośności na inne procesory. Jak można się domyślać, jest to znacznie bardziej zorientowane na sprzętowy koniec rzeczy. Wydrukowane kopie wydają się drogie i trudne do znalezienia, ale możesz pobrać tekst i kod za darmo.
Na szczęście istnieje również kilka innych możliwości - na przykład Projektowanie i wdrażanie systemu operacyjnego , na przykład Andrew Tanenbaum i Albert Woodhull.
źródło
Proponuję zacząć od drobnego, wysoce skoncentrowanego zadania: używając zestawu, napisz zabawkowy program ładujący. Nie musi wiele robić. Po prostu chcesz, aby komputer automatycznie ładował program podczas uruchamiania, drukował komunikat potwierdzający jego uruchomienie, czytał niektóre dane z klawiatury, drukował inną wiadomość, a następnie wyłączał komputer.
Miałoby to kilka zalet:
Gdy to zrobisz, będziesz miał znacznie lepszy pomysł na to, w co się pakujesz.
źródło
Nauka programowania w asemblerze jest dobrym początkiem, a wykonanie go w MSDOS 6.0 może być również pomocne ze względu na brak wbudowanych funkcji.
Czytanie dobrej książki, takiej jak Koncepcje systemu operacyjnego, byłoby dobrym początkiem do zaprojektowania własnego jądra. Będziesz musiał poradzić sobie z ładowaniem systemu rozruchowego, zarządzaniem sterownikami urządzeń, interfejsem z BIOS-em, tworzeniem i zarządzaniem systemem plików, planowaniem programu, ładowaniem i rozładowywaniem programu, wdrażaniem przynajmniej jakiejś powłoki (znacznie łatwiejszej niż budowanie systemu okienkowego).
C / C ++ będą działać tylko wtedy, gdy twoje jądro jest kompatybilne ze standardowymi bibliotekami dla tych języków, w przeciwnym razie musisz napisać kopię tych bibliotek.
To nawet nie zaczyna myśleć o wielowątkowości, bezpieczeństwie systemu, sieci.
źródło
Minix to niezły klon uniksowy (który zainspirował Linuksa), który został napisany do nauczania.
Andrew S. Tannenbaum jest doskonałym pisarzem i nauczycielem. Napisał całą książkę na temat systemów operacyjnych, używając Minix jako przykładu (i zawiera kod źródłowy do naśladowania): http://en.wikipedia.org/wiki/Operating_Systems:_Design_and_Implementation
Osobiście uważam, że jest on trochę lepszym pisarzem niż programistą, więc niektóre rzeczy nie są tak jasne, jak bym osobiście chciał, ale - hej - to działa!
Mogę zdecydowanie zalecić, aby potraktować to jako zasób edukacyjny. Daje to również pojęcie o ilości pracy potrzebnej do wyprodukowania czegoś, co może być naprawdę przydatne.
źródło
Ja też się tego uczyłem. Możesz sprawdzić te zasoby. Oni są bardzo dobrzy!
http://www.osdever.net/tutorials/index
http://kernelnewbies.org/
Miłej zabawy po drodze!
źródło