Porady dla ambitnego studenta na temat budowy własnego jądra [zamknięty]

18

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ć.

n0pe
źródło
12
Nie musisz cię denerwować za to, że chcesz się wszystkiego nauczyć. Ale jeśli planujesz faktycznie próbować, lepiej przedłużyć żywotność, nadludzki mózg i żadnych innych planów na swoje życie;)
2
Spodziewam się ich wszystkich! Nie bardzo, po prostu mam ogromną potrzebę nauki.
n0pe
@delnan Możliwa schizofrenia paranoidalna to także plus: templeos.org
DanteTheEgregore
@DanteTheEgregore What the?
Panzercrisis,

Odpowiedzi:

34

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.

Jerry Coffin
źródło
Wow dzięki za miłą odpowiedź. Zajrzę do wszystkich tych książek.
n0pe
7
Dodałem linki do plików PDF książki i źródła. Niesamowitą rzeczą w źródle v6 UNIX jest to, że ma on 100 stron i 100 linii na stronę. A w 10 000 wierszy kodu masz kompletny, wielozadaniowy system operacyjny . Jeśli naprawdę potrafisz zrozumieć kod otaczający słynny komentarz z linii 2238 „Nie oczekuje się, że to zrozumiesz”, możesz dać sobie Złotą Gwiazdę i Honorowych Mistrzów. Cieszyć się!
Peter Rowell,
Dzięki za linki! Teraz muszę wymyślić, gdzie to wydrukować ...
n0pe
1
Minix (książka Tannenbauma) jest przeznaczony do edukacji i może być właśnie tym, czego potrzeba.
@PeterRowell, dmr stwierdził, że jest to błąd w cm.bell-labs.com/who/dmr/odd.html
12

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:

  1. W końcu będziesz potrzebować procesu ładowania jądra, więc nie będzie to bezcelowe ćwiczenie.
  2. To da ci praktykę pisania na zgromadzeniu.
  3. To da ci praktykę w pisaniu procedur niskiego poziomu we / wy. Jak napisać wiadomość na ekranie lub odczytać naciśnięcie klawisza, gdy nie ma systemu operacyjnego, z którego można by się połączyć?
  4. Da ci doświadczenie w przeprowadzeniu badań technicznych szczegółów procesora i płyty głównej. (Pierwsze pytanie: jak twoja płyta główna / procesor znajduje program rozruchowy po uruchomieniu?)
  5. Pisanie jąder stało się bardzo skomplikowanym zadaniem, z mnóstwem subtelności. To zadanie da ci coś na początek, a być może powstrzyma cię przed zagubieniem się w chwastach, zanim jeszcze zaczniesz.

Gdy to zrobisz, będziesz miał znacznie lepszy pomysł na to, w co się pakujesz.

Charles E. Grant
źródło
Dzięki za to, myślę, że właśnie to zamierzam zrobić. Więcej lektur w mojej przyszłości.
n0pe
7

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.

Peter Smith
źródło
7

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
Polecam kupienie fizycznej książki. Łatwiej robić notatki.
Właściwie to o tym myślę, myślę, że widziałem książkę o Amazonie tanio. Mogę to tam dostać. Dzięki
n0pe
Pamiętaj też, że jest to trzecia edycja. Wydaje mi się, że użyliśmy pierwszej edycji, kiedy miałem kurs.