Może to na próżno, ponieważ wiem, że pisanie systemu operacyjnego jest nieznośnie skomplikowane (zwłaszcza dla siebie).
Nie spodziewam się, że będę budował następny Linux lub Windows.
Wiem, że to będzie okropne, wadliwe i nie zadziała, ale to w porządku.
Chcę napisać wszystko sam, w asemblerze , C i (trochę) C ++ .
To jest projekt na przyszłość, ponieważ w tej chwili jestem zajęty innymi sprawami i nie mam czasu od razu, ale pomyślałem, że zapytam go teraz, więc może mógłbym uzyskać wiele odpowiedzi na ten temat i mógłby budować i być użytecznym źródłem dla tego rodzaju podejścia (wszystko inne, co widziałem, obejmowało budowanie z minixa, używanie istniejącego bootloadera, budowanie go w wirtualnym programie rozruchowym itp.).
Chcę skonfigurować jeden z moich starszych komputerów stacjonarnych z monitorem, klawiaturą i myszą i rozpocząć pracę na pustym dysku twardym.
Chcę się nauczyć, jak napisać własny bootloader (znalazłem wiele zasobów na ten temat, ale dla kompletności proszę jeszcze dodać kilka dobrych), własny sterownik USB (jeśli to konieczne), sterownik CD (jeśli to konieczne ) itp. Wszystko od podstaw.
Jak umieścić kod na komputerze? Czy najlepiej to zrobić za pomocą dyskietki? Czy większość komputerów może to zrobić z pamięci USB?
Jakich sterowników potrzebuję i czy możesz zasugerować jakieś odniesienia do ich budowy?
Po sekwencji bootowania - co wtedy? Jak przejść do trybu chronionego itp.
Jak zarządzać pamięcią bez pomocy systemu operacyjnego? Czy po prostu używam dowolnych adresów? Inicjalizacja nie jest konieczna?
Co niewątpliwie napotkam, co mnie zmyli?
Jak mogę sprawić, by był to O / S z wiersza poleceń i graficzny?
Na czym opiera się graficzny system operacyjny? Na przykład, jak zrobiłbym coś takiego, wiersz poleceń, z czcionką i obrazkiem na górze?
Gdzie mogę przeczytać o konfigurowaniu środowiska wielozadaniowego? (tj. mając obok siebie dwa podobne do graficznego wiersze poleceń).
Jak ustawić rodzaj systemu okienkowego? Jak wyświetlić grafikę na ekranie po skonfigurowaniu prostej wielozadaniowości?
Uwierz mi, rozumiem, że jest to bardzo skomplikowany projekt i prawdopodobnie nigdy nie dojdę do jego ukończenia ani do napisania na nim czegokolwiek użytecznego.
Jest w tym wiele innych elementów, o których nie wspomniałem, jeśli o czymś pomyślisz, możesz je również dodać.
W każdej odpowiedzi umieść jeden „temat” - na przykład sterowniki USB, a następnie może listę zasobów, rzeczy, na które należy zwrócić uwagę itp.
Ponadto nie sugeruj tworzenia innego systemu operacyjnego lub istniejącego kodu. Wiem, że przeczytam dużo wcześniej istniejącego kodu (takiego jak jądro systemu Linux lub przykładowe zasoby, istniejące sterowniki itp.), Ale ostatecznie chcę napisać cały tekst samodzielnie. Wiem, że powinienem zbudować coś innego, i jest wiele innych pytań dotyczących SO na ten temat, które mogę przeczytać, jeśli zmienię zdanie i pójdę tą drogą. Ale w tym wszystkim chodzi o zrobienie wszystkiego od zera.
Jakieś sugestie, jak uzyskać grafikę? Różne tryby wideo i jak z nimi pracować itp.?
źródło
Odpowiedzi:
Najpierw najważniejsze. Czytaj, czytaj, czytaj, czytaj, czytaj. Musisz dobrze zrozumieć, jak działa system operacyjny, zanim będziesz mieć nadzieję na wdrożenie własnego.
Pobierz jedną z książek Andrew Tanenbauma o systemach operacyjnych. To jest ten, którego używaliśmy na moich zajęciach z systemu operacyjnego na studiach:
Nowoczesne systemy operacyjne PDF
Nowoczesne systemy operacyjne na Amazon
Mimo śmiesznej okładki to fantastyczna lektura, szczególnie jak na podręcznik. Tanenbaum jest naprawdę ekspertem w tej dziedzinie, a jego wyjaśnienia dotyczące działania systemu operacyjnego pod maską są jasne i łatwe do zrozumienia. Ta książka jest głównie teorią, ale wydaje mi się, że ma też książkę, która omawia więcej implementacji. Jednak nigdy tego nie czytałem, więc nie mogę tego komentować.
To powinno pomóc ci w zarządzaniu procesami, zarządzaniu pamięcią, systemach plików i wszystkim innym, co jądro systemu operacyjnego musi zrobić, aby uzyskać stan startowy. Od tego momentu jest to w zasadzie kwestia pisania sterowników urządzeń dla sprzętu, który musisz obsługiwać, i oferowania implementacji funkcji biblioteki C do wykonywania wywołań jądra takich rzeczy, jak otwieranie plików i urządzeń, czytanie i pisanie, przekazywanie wiadomości między procesami itp. .
Przeczytaj więcej o montażu x86 (zakładając, że projektujesz to dla maszyny x86). To powinno odpowiedzieć na wiele pytań dotyczących przechodzenia między trybami pracy procesora.
Jeśli masz jakąkolwiek wiedzę na temat elektroniki, może być łatwiej zacząć od napisania systemu operacyjnego dla urządzenia wbudowanego, które ma obszerną dokumentację, ponieważ generalnie będzie prostszy niż komputer PC x86. Zawsze chciałem również napisać własny system operacyjny i zaczynam od napisania systemu operacyjnego z wbudowanym mikrojądrem dla This Development Board firmy Digilent. Może obsługiwać miękki procesor MicroBlaze firmy Xilinx, który ma bardzo dokładną dokumentację. Ma też trochę pamięci RAM, pamięć flash, diody LED, przełączniki, przyciski, wyjście VGA itp. Mnóstwo rzeczy do zabawy przy pisaniu prostych sterowników.
Jedną z zalet urządzenia wbudowanego jest także to, że można uniknąć pisania sterownika VGA przez długi czas. W moim przypadku płyta rozwojowa Digilent ma wbudowany UART, więc mogę efektywnie wykorzystać wyjście szeregowe jako moją konsolę, aby wszystko uruchomić i uruchomić z wiersza poleceń przy minimalnym zamieszaniu.
Po prostu upewnij się, że cokolwiek wybierzesz, ma do tego łatwo dostępny i dobrze przetestowany kompilator. Zdajesz nie chcą być pisanie OS i kompilator w tym samym czasie.
źródło
http://www.osdev.org/ i http://www.osdever.net/
witamy w świecie OS Development.
Zobacz także inne linki do dokumentacji x86 w SO x86 tag wiki : podręczniki Intel i AMD, dokumentacja kompilatora / asemblera i różne przewodniki.
Sugeruje również użycie BOCHS lub innego środowiska wirtualnego do debugowania, ponieważ możesz wykonać jeden krok swojego bootloadera i zbadać rejestry.
źródło
Sugerowałbym, przynajmniej na początku, popracować nad Bochs lub innej maszynie wirtualnej, ponieważ możesz zabrać ją ze sobą, gdziekolwiek chcesz, łatwiej jest debugować (możesz zobaczyć dokładny stan sprzętu), a jeśli potrzebują pomocy z zewnątrz w debugowaniu, mogą używać dokładnie tego samego „sprzętu” co Ty.
Najbardziej użyteczną radą, jaką mam, jest wprowadzenie się w stan, w którym można uruchomić kod w C tak szybko, jak to możliwe - tj. Uruchomić komputer, skonfigurować tablice deskryptorów i dotrzeć do punktu, w którym można bezpiecznie uruchomić skompilowane C. Większość jeśli nie, całe jądro powinno znajdować się w C, jeśli chcesz pozostać przy zdrowych zmysłach i dalej nad nim pracować. Montaż, choć w niektórych miejscach wymagany, jest żmudny i trudny do debugowania.
źródło
Na najniższym poziomie minimum, które system operacyjny musi być w stanie zrobić, to w jakiś sposób sterować sprzętem systemu i w jakiś sposób ładować wykonanie pewnego rodzaju „kodu użytkownika”. Jeśli zamierzasz zacząć od komputera, musisz napisać kod, który będzie mógł być przez niego ładowany z takiego lub innego urządzenia. Starsze komputery mają BIOS w oprogramowaniu układowym, który określa sposób wykonywania inicjalizacji przez sprzęt (przynajmniej wideo, klawiaturę i jakąś formę pamięci lub programu ładującego). (Aktualizacja z października 2017 r .: nowsze komputery mają oprogramowanie układowe EFI lub UEFI ... co jest w dużej mierze pedantyczną różnicą; służą tym samym celom w tej dyskusji).
Zacznij więc od zapoznania się z niskopoziomowymi szczegółami dotyczącymi korzystania z systemu BIOS lub innego oprogramowania układowego w systemie docelowym. To znaczy, dowiedz się, jak napisać program, który BIOS może załadować i wykonać. To ostatecznie przekształci się w program ładujący. Zacznij od czegoś małego. Po prostu weź program, który drukuje: „Hello, Linus” bezpośrednio z procesu uruchamiania oprogramowania sprzętowego (na dyskietce lub pendrive'ie byłoby dobrym początkiem ... lub na dysku twardym, jeśli chcesz).
Stamtąd poleciłbym napisanie bardzo prostego sterownika szeregowego ... zaktualizuj program ładujący, aby zainicjować port szeregowy i rozpocznij pobieranie z tego portu. Następnie może wykonać kod, przez który przeciąga. Stamtąd napisz trochę bootstrapu, który może zapisywać do innego zestawu bloków (nie wdrożyliśmy jeszcze systemu plików ... nawet analizowania tabeli partycji; więc najpierw zajmowalibyśmy się surowymi zakresami bloków na dysku ).
W tym momencie twój program ładujący powinien być w stanie pobrać nowy kod przez linię szeregową, zrzucić go na partycję (tak, zaimplementować obsługę tablicy partycji ... czy będzie ona zgodna ze standardowymi konwencjami PC, zależy od ciebie ) i wykonaj go.
Stamtąd powinieneś być w stanie pracować nad znacznie bardziej wyrafinowanymi funkcjami. Z tej bazy możesz napisać i skompilować nowe "jądro" ... zrestartuj swoje środowisko testowe i umieść na nim nowe jądro.
(Twój bootloader powinien pobrać jakiś sygnał, taki jak BREAK przez szeregowe linie uzgadniania, jako polecenie pominięcia pobierania i po prostu załadowania istniejącego obrazu; iw ten sposób powinien również obsłużyć pewien limit czasu).
Stamtąd napisać bardzo prostą warstwę terminala i powłokę poleceń? System plików? Implementuj polecenia, aby pobrać nową zawartość wykonywalną inną niż jądro (pliki lub obiekty pewnego rodzaju). I tak dalej.
Oczywiście mogłeś zacząć od sterownika konsoli używając klawiatury PC i wideo (odpowiednio BIOS INT 0x16h i INT 0x10H, jeśli dobrze pamiętam). Jednak sugerowałbym rozpoczęcie od sterownika szeregowego, ponieważ można następnie zautomatyzować cykl kompilacji / wdrażania / testowania z dowolnego innego istniejącego (funkcjonalnego) systemu. Ponieważ twój nowy system operacyjny zacznie się jako projekt skompilowany krzyżowo, niezbędne będzie posiadanie usprawnionego sposobu obsługi tego.
Nie wiem, jak daleko chcesz posunąć się ze swoim projektem. Dość imponującym celem byłoby osiągnięcie „samodzielnego hostingu”. Jeśli możesz stworzyć prosty asembler / kompilator, który pozwoli ci użyć twojego nowego systemu operacyjnego do (ponownego) kompilowania, łączenia i uruchamiania działającej wersji twojego nowego systemu operacyjnego ... to osiągnąłeś ten cel. (Zauważ, że nie jest to wymagane. Wiele systemów wbudowanych nigdy nie będzie samoobsługowych i nie ma w tym nic złego).
źródło
Jeśli nie masz nic przeciwko wirtualizacji sprzętu, istnieje kurs (książka + wykłady + oprogramowanie), który zabierze Cię „Od Nand do Tetris”. Cały system komputerowy tworzysz całkowicie samodzielnie, od (w tym celu atomowej i podanej) elektrycznej bramki NAND, aż do zbudowania systemu operacyjnego, języka i wreszcie kodowania prostej gry na osobistym komputerze.
Myślę, że to świetny pomysł i zamierzam wkrótce w to wpaść. Książka jest zaskakująco tania i uważam, że kurs jest prowadzony na MIT. Nie mogę sobie wyobrazić większego uczucia niż posiadanie pełnej, kompletnej wiedzy o całym systemie, który sam zbudowałeś od podstaw.
Link: http://www1.idc.ac.il/tecs/
źródło
Zacząłbym od małego i kupiłbym wbudowany zestaw programistyczny 8086 i opracowałbym na nim wielozadaniowy system operacyjny. Gdy masz już jądro i zaznajomisz się z pracą na poziomie sprzętowym, będziesz gotowy do zrobienia czegoś bardziej wymagającego.
Zbudowanie nawet klonu DOS z wyświetlaczem VGA jest dość trudnym zadaniem. Szczegóły są ogromne. :-)
konkretne tematy.
Jak umieścić kod na komputerze? Czy najlepiej to zrobić za pomocą dyskietki? Czy większość komputerów może to zrobić z pamięci USB?
BIOS wykona elementarne ładowanie początkowe.
Jakich sterowników potrzebuję i czy możesz zasugerować jakieś odniesienia do ich budowy?
wszystko, co nie jest bezpośrednimi operacjami na procesorze / pamięci. Wszystko, czego nie ma bezpośrednio w instrukcji obsługi procesora.
Po sekwencji bootowania - co wtedy? Jak przejść do trybu chronionego itp.
Tryb chroniony będzie częścią sekwencji rozruchowej.
następnie zaczynasz wielozadaniowość i zastanawiasz się, jak rozpocząć procesy.
Jak zarządzać pamięcią bez pomocy systemu operacyjnego? Czy po prostu używam dowolnych adresów? Inicjalizacja nie jest konieczna?
Poprawny. Prawdopodobnie będziesz chciał w końcu uporządkować system pamięci wirtualnej.
Co niewątpliwie napotkam, co mnie zmyli?
brak narzędzi do debugowania, brak IO
Jak mogę sprawić, by był to O / S z wiersza poleceń i graficzny?
Z żalem. Wyszukaj Windows 3.1 i Linux, w szczególności X windows.
Na czym opiera się graficzny system operacyjny? Na przykład, jak zrobiłbym coś takiego, wiersz poleceń, z czcionką i obrazkiem na górze?
Wyszukaj X okien.
ostatnia rada: przestudiuj windowsa linux / x. Nie jest doskonałe, ale pozwala zrozumieć jedno podejście. Przestudiuj także systemy wbudowane.
źródło
Widzę wiele dobrych odniesień do witryn programistycznych dla systemów operacyjnych, więc opiszę inne podejście:
Jeśli chcesz mieć doświadczenie we wdrażaniu systemu operacyjnego z samego metalu, są o wiele lepsze opcje sprzętowe niż stary komputer. Dzięki architekturze PC spędzisz nadmierną ilość czasu na kodowaniu nieciekawych artefaktów z 30-letniej historii projektowania. Na przykład tylko część projektu bootloadera wypaliła prawdopodobnie niejednego odważnego programistę.
Na przykład, będziesz potrzebować jednego zestawu sterowników, aby odczytać jądro z dysku i / lub sieci. Wtedy będziesz potrzebować kodu, aby przejść do trybu chronionego. W tym momencie potrzebujesz innego zestawu sterowników! Bardzo niewiele pracy, którą wykonujesz, aby wprowadzić chip w tryb chroniony, będzie można przenieść po tym momencie. Chcesz uruchomić go na innym komputerze + - 4 lata i będziesz potrzebować jeszcze jednego zestawu sterowników.
Przyjrzyj się ładowaniu ARM lub innego 32-bitowego "osadzonego" układu. Dostępne są niedrogie płytki programistyczne lub możesz wlutować własne! Niektóre mają wbudowane złącze Ethernet i USB. Myślę, że praca nad rozsądną, nieskalaną architekturą sprawi ci więcej radości i być może zdobędziesz kilka umiejętności wielokrotnego użytku.
źródło
Bardziej niż cokolwiek innego, jeśli chcesz, aby działało to na prawdziwym sprzęcie, absolutnie potrzebujesz kopii instrukcji obsługi procesora. Podręczniki firmy Intel ( http://www.intel.com/products/processor/manuals/ ) są nieocenione. Przechodzą przez wszystko, od przełączania trybów (rzeczywistych / chronionych) po zarządzanie pamięcią wirtualną (jeśli zdecydujesz się posunąć tak daleko) do wykonywania wywołań systemowych (jeśli kiedykolwiek przejdziesz do trybu użytkownika). Co najważniejsze , wyjaśniają bardzo szczegółowo wiele rzeczy, które muszą być skonfigurowane, aby rzeczy działały, takie jak TSS i rejestry segmentowe, których większość tekstów OS nie omawia, ponieważ są bardziej zainteresowani koncepcjami wyższego poziomu niż procesorem. szczegółowe informacje.
źródło
Seria Rozwój OS @ BrokenThorn mogą Cię zainteresować.
źródło
Spróbuj przeczytać kod małego, podstawowego systemu operacyjnego typu open source, takiego jak MikeOS.
Alternatywnie proponuję następujące kroki (powinno być zabawne!):
Powyższe kroki mogą wydawać się głupie przy pisaniu prostego systemu operacyjnego, ale hej, to cholerna zabawa.
źródło
sprawdź MikeOS . Jest to dość prosty system operacyjny, który można odczytać (jak w komentarzu). Mimo że jest dość prosty, ma GUI i obsługuje niektóre sieci i multimedia.
edycja : MenuetOS jest graficzne. Jest również napisany prosto jako asm, ale jest bardziej wyrafinowany niż MikeOS
źródło
Masz ambitny cel. Ale wykonanie jest kluczowe.
Większość ustrukturyzowanych podejść (podręcznik lub zajęcia w college'u) poprowadzi Cię przez ten proces, ale dostarczają wielu drobiazgowego kodu, który błyszczy tajemnymi szczegółami wybranej platformy i pozwala skupić się na ogólnych pomysłach: planowanie procesów, zarządzanie pamięcią, zapobieganie zakleszczeniom, operacje we / wy i tak dalej.
Moja rada jest następująca: ogranicz swoje oczekiwania i zacznij od podstawowego pytania.
Co to jest system operacyjny?
Informatyk (miejmy nadzieję) nigdy nie powie, że system operacyjny jest graficznym interfejsem użytkownika, przeglądarką internetową, sposobem na podłączenie urządzeń USB lub czymkolwiek, co użytkownik może zobaczyć lub dotknąć. Zamiast tego system operacyjny na najbardziej podstawowym poziomie to te, o których wspomniałem powyżej. Wszystkie mieszczą się pod jednym wielkim parasolem: zarządzaniem zasobami.
System operacyjny to nic innego jak program zarządzający zasobami sprzętowymi komputera: pamięcią, procesorem i urządzeniami peryferyjnymi.
Oto prosty system operacyjny: program umożliwia użytkownikowi wpisanie programu (szesnastkowo lub binarnie) przy użyciu połączenia szeregowego. Po wpisaniu programu uruchamia program. Po zakończeniu programu kontrola jest zwracana do użytkownika, gdzie może ponownie uruchomić program lub wpisać nowy.
Zrób to na „czystej” architekturze, takiej jak wbudowany procesor ARM z około 64 KB pamięci. Możesz to zakodować w assemblerze po kilku dniach nauki tajników ARM. I voila! masz sobie system operacyjny.
Robi wszystko, co powinien robić system operacyjny:
Daje to element konstrukcyjny, od którego można zacząć. Masz teraz wiele możliwości wyboru. Być może jednym z nich byłoby zezwolenie na załadowanie dwóch programów do pamięci i pozwolenie użytkownikowi zdecydować, który z nich uruchomić jako następny.
Możesz też pozwolić użytkownikowi zawiesić wykonywanie jednego programu, przełączyć się na inny, zawiesić i przełączyć z powrotem. Jest to podstawowa wielozadaniowość, mimo że jest całkowicie ręczna.
Twoje wybory są nieograniczone, ale każdy jest o krok od tego, co miałeś wcześniej.
To zabawne, jeśli nie ustawisz zbyt wysoko!
źródło
Utrzymuję listę zasobów na StackOverflow: Jak rozpocząć tworzenie systemu operacyjnego . Proszę, dodaj do niego nowe zasoby, gdy zaczynasz swoją przygodę (zaraz zacznę :))
źródło
Wiele szkół ma klasy systemu operacyjnego, które wykonują wiele z tego, co opisujesz. Moja szkoła (CMU) uczyła systemu operacyjnego w C, napisaliśmy jądro, system plików i powłokę oraz otrzymaliśmy kod do programu ładującego.
Niestety, nie udało mi się znaleźć w sieci żadnego ostatecznego źródła informacji na temat tego kursu (15-412) i z czasem ewoluowało. Ale być może ludzie mogliby zamieścić linki do źródeł i zadań dla szkół, które mają dobre zasoby w sieci.
źródło
Może spodobał Ci się ten samouczek zatytułowany „Stwórz własny klon systemu UNIX-zabawki”, jest on bardzo wnikliwy i powinien pomóc ci w drodze.
Powodzenia.
źródło
Przestudiuj system A2 (dawniej nazywany systemem Oberon ), aby znaleźć pomysły, które możesz ukraść. Jest to graficzny system operacyjny zbudowany tylko przez dwie osoby, choć trzeba przyznać, że jedną z nich jest Niklaus Wirth. Wydany po raz pierwszy około 1990 roku, a prędkość jest zadziwiająco dobra. Jest książka autorstwa Gutknechta.
źródło
O programowaniu grafiki niskiego poziomu, to dostarczy Ci wielu informacji: http://www.osdever.net/FreeVGA/home.htm . (Jest to również bardzo interesujące w trybie tekstowym).
Zrozumiesz, że na PC jest bardzo dużo rzeczy, które są niejasne: sam zestaw instrukcji x86 jest skomplikowany, a kiedy uzyskasz bezpośredni dostęp do sprzętu, może minąć trochę czasu, zanim zrozumiesz, jak napisać pojedynczy znak na ekranie .
Nie martw się o dyskietkę i tym podobne, przez większość czasu będziesz używać emulatora, takiego jak Bochs lub QEmu.
źródło
Możesz rozważyć przyjrzenie się pojęciom systemów operacyjnych autorstwa Abrahama Silberschatza - Zrozumienie koncepcji programowania systemów jest podstawowym wymaganiem, zajrzyj do jądra F / OSS systemów operacyjnych linux * BSD i GNU / Linux , zwłaszcza wcześniejszych wersji, które są prawdopodobnie nieco bardziej udokumentowane.
źródło
Spójrz na Minix . Zapoznaj się z kodem źródłowym wraz z częścią „ Projektowanie i wdrażanie systemów operacyjnych ”. Rozważ wniesienie wkładu w projekt. Myślę, że Minix to naprawdę dobry i obiecujący system operacyjny w trakcie tworzenia. Jest to również projekt dobrze finansowany. Oznacza to, że możesz nawet otrzymać zapłatę za swoje składki!
źródło
Jest to bardzo proste dzięki temu, że BIOS ma już wbudowanych wiele funkcji wejścia / wyjścia do zmiany trybu ekranu, zmiany koloru pikseli, pisania tekstu na ekranie i wielu innych rzeczy. Jednak nie obejmuje obsługi systemów plików, jest to jedna z niewielu rzeczy, które musisz włączyć do swojego systemu operacyjnego.
BIOS ładuje pierwszy sektor na dysku twardym i stamtąd rozpoczyna wykonywanie kodu, więc system operacyjny musi być umieszczony z pierwszą instrukcją w pierwszym sektorze na dysku twardym.
Ten artykuł w Wikipedii powinien pomóc Ci zapoznać się z przerwaniami BIOS-u do pisania tekstu na ekranie, odbierania klawiszy z klawiatury i innych rzeczy. https://en.wikipedia.org/wiki/BIOS_interrupt_call
Nawet jeśli planujesz używać c ++, zdecydowanie polecam przeczytanie o programowaniu w asemblerze, ponieważ jest to niezbędne, aby zrozumieć, jak działa sprzęt.
źródło