Najlepsza odpowiedź
To zależy od tego, co rozumiesz przez system operacyjny. Kiedyś napisałem prosty system kolejkowania, który wykonywałby wiele sesji protokołów w sposób okrężny. Ale działał w standardowym systemie operacyjnym. Kiedy po raz pierwszy pojawiły się mikrokontrolery dla systemów wbudowanych, inżynierowie zazwyczaj pisali swój własny podstawowy system operacyjny, jak wskazano w jednej z pozostałych odpowiedzi.
Najmniejszy użyteczny system operacyjny, z którego korzystałem, który miał podstawowe cechy wielozadaniowości działającej – system półkowy nazwano QNX. Był to okrojony system Unix i działał na pierwszym IBM PC. Nie miał wyszukanej grafiki, ale mogłem wygodnie tworzyć na nim oprogramowanie. W rzeczywistości jedyną prawdziwą różnicą w stosunku do nowoczesnej maszyny był interfejs użytkownika z kolorami i grafiką. Zasadniczo więc wprowadzenie DOS przez IBM cofnęło przemysł komputerowy o co najmniej 10 lat. Wokół było wiele lepszych systemów operacyjnych (które można było zaadaptować) lub były rozwijane w tym czasie, przy czym, oczywiście, Unix wyznaczał standard.
Odpowiedź
Właśnie skończyłem opracowywać jądro dla klasy ( CS-4284 Systems & Networking Capstone ) podczas mojego ostatniego semestru w szkole. Wcześniej wziąłem klasę systemu operacyjnego, która ma na celu pracę z systemem operacyjnym z perspektywy programisty, a nie projektanta systemu operacyjnego. Będąc zaangażowanym w rozwój systemu operacyjnego i jądra przez ostatnie półtora roku (to nie jest przez długi czas, ale „dużo się nauczyłem”, oto co polecam:
1. Mistrzu C Nie mogę już tego podkreślać. Nie, naprawdę, opanuj to. Rozwój systemu operacyjnego jest trudny. Zawiera wiele koncepcji, których naprawdę potrzebujesz opanować C, więc nie przeszkadza. Na przykład weź potok Uniksa (wpisany | w powłoce). Aby opracować potok w swoim systemie operacyjnym, musisz naprawdę dobrze zrozumieć system plików systemu operacyjnego i strukturę plików. Jest to typowy problem z ograniczonym buforem (konsument / producent) i będzie musiał radzić sobie z całą synchronizacją. Podczas pisania musisz być świadomy pamięci wirtualnej. Ponadto Unix jest zwykle BYOB (przynieś własny bufor). będzie musiał odpowiednio zarządzać buforem udostępnionym przez użytkownika itp. Ostatnią rzeczą, jaką chciałbyś tutaj zrobić, jest zajęcie się podstawowymi kwestiami C, takimi jak wskaźniki i zarządzanie pamięcią (uwaga: zarządzanie pamięcią w systemie operacyjnym jest 10 razy trudniejsze niż zarządzanie pamięcią w C: musisz być świadomy przestrzeni adresowej użytkownika i jądra)
2. Jądro a system operacyjny Musisz zrozumieć różnicę między jądrem a systemem operacyjnym. Jądro jest zasadniczo mózgiem systemu operacyjnego. System operacyjny to zestaw aplikacji w pakiecie. Na przykład Mac OS X zawiera: jądro, interfejs (GUI), wbudowane standardowe aplikacje (Finder – co jest tylko abstrakcją wizualizuj system plików, TextEdit, powłokę itp …)
3. Nie nurkuj od razu Nie można zacząć zrobienie rozwoju jądra w ciągu kilku dni lub tygodni. Proponuję zacząć od następujących rzeczy:
- Zapoznaj się z krokami kompilacji GCC (co dzieje się, gdy uruchamiasz gcc, jak powstaje plik wykonywalny i co kiedy uruchamiasz program) .Możesz także napisać prosty asembler w C (wziąć kod asemblera jako wejściowy i wyjściowy kod maszynowy. Wymaga to zrozumienia, jakie sekcje .data, .text i .bss są w asemblerze (bardzo pomocne droga do zrozumienia pamięci wirtualnej systemu operacyjnego). Zrozumiesz także adresowanie na poziomie komputera i sposób rozwiązywania gałęzi.
- Zapoznaj się z mach narzędzia i programy wielopoziomowe. Proponuję zrobić laboratorium bombowe, ponieważ jest tam wiele materiałów edukacyjnych. Po prostu google bomb lab.
- Zapoznaj się z podstawowymi atakami na system operacyjny. Proponuję przyjrzeć się przepełnieniu bufora z tego samego powodu, co w punkcie 1 (laboratorium przepełnienia bufora Google).
- Dowiedz się o wywołaniach systemowych, wątkach i procesach w C. Stamtąd stwórz własną powłokę w C.
- Dowiedz się o alokacji pamięci i zaimplementuj malloc i free w C. Dowiedz się o kompromisach projektowych, strategiach alokacji, strategiach zwalniania itp …
- Dowiedz się więcej o wielowątkowości i przetwarzaniu wielowątkowym w C. Stamtąd zanurz się w mechanizmach synchronizacji (blokady, muteksy, semafory) i stwórz pulę wątków w C, z której będą mogły korzystać inne programy.
4. Teraz możesz rozpocząć prawdziwy, ale uproszczony rozwój jądra systemu operacyjnego W tym momencie możesz rozpocząć programowanie na prawdziwym systemie operacyjnym jako projektant systemu operacyjnego. Google Stanford Pintos, a uzyskasz dostęp do małego jądra edukacyjnego opracowanego w Stanford. Zawiera dokumentację i zestaw 4 projektów. Możesz znaleźć w Google niektóre szkoły, które mają slajdy z wykładami dla Pintos. Proponuję zakup koncepcji systemu operacyjnego ( Amazon.com: pojęcia dotyczące systemu operacyjnego (9781118063330): Abraham Silberschatz, Peter B.Galvin, Greg Gagne: Książki ). Dokumentacja jest całkiem dobra, a projekty dobrze wyjaśnione. System operacyjny zawiera również testy, które możesz uruchomić, uruchamiając `make check`, dzięki czemu możesz sprawdzić, czy wszystko zostało wykonane poprawnie, czy nie.
5. Możesz zacząć współtworzyć Linuksa Badanie kodu źródłowego i decyzje projektowe dotyczące Linuksa (które są dużo bardziej skomplikowane niż Pintos) zajmie dużo wysiłku, ale myślę, że w tym momencie będziesz przynajmniej zacząć. Dzięki większej praktyce i czytaniu będziesz w stanie to opanować.
Właśnie ukończyłem krok 4. Uwielbiałem kroki od 1 do 3, ale szczerze mówiąc, w połowie 4 zdałem sobie sprawę, że nie jestem ŻADNY zainteresowany rozwojem systemu operacyjnego. Bardzo podobała mi się praca z systemem operacyjnym jako programista (z perspektywy programisty), ale nie czerpałem tyle przyjemności z kopania głębiej. Jednak wiele się nauczyłem podczas tworzenia jądra, a to pozwala ci poznać wiele rzeczy. Ponadto, jeśli potrafisz napisać jądro, piszesz tam dowolne oprogramowanie. Zdecydowanie zalecam wykonanie przynajmniej pierwszych 3 kroków, ponieważ daje to doskonały wgląd w system operacyjny. Dosłownie staniesz się ogólnie lepszym inżynierem oprogramowania. Nauczysz się bardziej doceniać języki wysokiego poziomu i nauczysz się, jak używać odpowiedniego narzędzia / języka / technologii do odpowiedniego zadania.
Mam dużo materiałów na temat rozwoju systemu operacyjnego, projektów, testów itp … Jeśli ludzie są zainteresowani, daj mi znać, komentując, a być może będę mógł stworzyć eBook / samouczek / przewodnik online ze środowiskiem testowym, które poprowadzi początkujących do rozwoju systemu dostarczać projekty i opinie do pracy.