Witamy w kolejnym poście na temat jak stworzyć własny system operacyjny (Poprzednie artykuły z serii: 1, 2, 3, 4, 5 y 6). Minęło dużo czasu od ostatniego posta, głównie z powodu błędu, który znalazłem w tym, co mamy dzisiaj. Zobaczymy jak obsługiwać zegar na architekturach x86.
Wcześniej aktywowaliśmy IRQ w sposób ogólny, ale był mały problem, ponieważ nie aktywowaliśmy ich poprawnie i przekazaliśmy dodatkowe dane. W końcu to naprawiamy carlosorta i ja i ja możemy nadal komentować, jak kontynuować.
Cóż, zegar to IRQ, a konkretnie pierwszy. Aby go skonfigurować, użyjemy funkcji, którą zdefiniowaliśmy powyżej, aby ogólnie zainstalować IRQ, ND_IRQ_InstallHandler.
int ND_TIMER_TICKS = 0; void ND :: Timer :: Faza (int hz) {int divisor = 1193180 / hz; ND :: Ports :: OutputB (0x43,0x36); ND :: Ports :: OutputB (0x40, dzielnik & 0xFF); ND :: Ports :: OutputB (0x40, dzielnik >> 8); } void ND :: Timer :: Wait (int ticks) {unsigned long eticks; eticks = ND_TIMER_TICKS + tiki; while (ND_TIMER_TICKS <eticks) {void ND :: Timer :: Setup () {ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BLACK); ND :: Screen :: PutString ("\ nSetup timer ..."); ND_IRQ_InstallHandler (0, & ND_Timer_Handler); ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_GREEN); ND :: Screen :: PutString ("gotowe"); } extern "C" void ND_Timer_Handler (struct regs * r) {ND_TIMER_TICKS ++; if (ND_TIMER_TICKS% 18 == 0) {// ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BROWN); // ND :: Screen :: PutString ("\ nJedną sekundę więcej"); POWINNIŚMY ZROBIĆ EKRAN ODŚWIEŻENIA}}
Kod działa w następujący sposób: wywołania systemowe inicjalizacji ND :: Timer :: Setup, który dzwoni ND_IRQ_InstallHandler aby wstawić na pierwszej pozycji IRQ0, funkcję zwrotną w przypadku wystąpienia zdarzenia ND_Timer_Handler to zwiększa kleszcze. Ponieważ ustawiliśmy częstotliwość zegara na 18 Hz, jak zobaczymy później, gdybyśmy podzielili go przez 18 i dali nam liczbę całkowitą, minęłaby sekunda.
Funkcja ND :: Timer :: Faza Pomaga nam dostosować prędkość Timer, ta ekstrawagancka liczba to 1.19 MHz, co jest wartością wspólną. Cóż, powinniśmy wywołać tę funkcję, jeśli chcemy zmienić prędkość Timer, domyślnie dochodzi do 18,22 Hz, osobliwej wartości, w ramach której ktoś musiał zdecydować IBM i tak pozostało do dziś.
Funkcja ND :: Timer :: Czekaj to całkiem proste, po prostu poczekaj z pętlą Podczas dopóki kleszcze trzeba było kontynuować.
Na obrazku widzimy, że jeśli odkomentujemy kod wewnątrz ND_Timer_Handler, otrzymamy to:
W następnym rozdziale zobaczymy, jak czytać dane wejściowe z klawiatury i trochę robić powłoka do interakcji z naszym systemem. Jak zawsze kod jest dostępny w GitHub na podstawie licencji GNU GPL v2.
Bardzo interesująca seria samouczków, osobiście nie widziałem wielu na temat tworzenia dystrybucji Linuksa od zera, a jeszcze mniej w języku hiszpańskim i tak kompletnym. Myślę, że możesz się wiele z tego nauczyć i mam nadzieję, że gdy tylko będę miał czas, będę mógł zrobić te samouczki.
Jedyne, o co proszę, to żebyś się nie zniechęcił i skończyłeś tutorial, ponieważ znalazłem wiele dobrych tutoriali, które nigdy się nie skończyły.
Pozdrawiamy i dziękujemy :).
To nie jest dystrybucja Linuksa, to jądro 😛.
Jesteś w błędzie. Tworzenie dystrybucji Linuksa nie oznacza programowania czegokolwiek, na przykład w Linuksie od zera nie programujesz, to co robisz to instalowanie (na podstawie kompilacji) podstawowych pakietów, które składają się na dystrybucję. To jest zupełnie inne. To tworzenie własnego systemu operacyjnego. Nie ma to nic wspólnego z linuxem. To właśnie robił Torvalds za swoich czasów, zainspirowany minixem, i prowadząc gorącą i popularną dyskusję między Torvaldsem a Andrewsem. tanenbaum na jądrze monolitycznym kontra mikrojądro.
Saludos!
Dzięki che. Do tej pory nie zwracałem zbytniej uwagi na Twój post, ale jestem w projekcie, więc zamierzam im się przyjrzeć.
Pozdrowienia.
Warto wspomnieć, że można używać innych języków, takich jak Objective-C (++), C ++, D lub Rust.
Ten jest w C ++, a nie w C. Jednak trudno jest dostrzec różnice, ponieważ wiele operatorów C ++ wymaga zaplecza biblioteki, na przykład operatorów new i delete. Byłoby bardzo interesujące stworzenie systemu operacyjnego w Rust. W rzeczywistości istnieje kanał IRC poświęcony systemom operacyjnym w Rust (# rust-osdev na irc.mozilla.net). Każdy, kto kompiluje do kodu maszynowego, jest naprawdę tego wart, w tym Java, jeśli używamy GCJ.
Tak, rzeczywiście, Rust jest bardzo interesującym językiem dla systemów operacyjnych, ponieważ jest nie tylko łatwiejszy do nauczenia niż C czy C ++ (nadal kontynuuje ciągłe zmiany, ale jest łatwiejszy), ale jest znacznie bezpieczniejszy.
W latach 70. dość powszechne było programowanie bezpośrednio na sprzęcie, bez systemu operacyjnego.
Świetnie ... teraz muszę tylko zrozumieć: 3 ...
Cześć. Bardzo dziękuję za te artykuły. Ale jeśli nie mam wiedzy programistycznej, myślę, że nie powinienem tego robić, prawda? To znaczy, gdyby nie to byłoby „dobrze, a teraz co mam kopiować i wklejać?”… Szkoda, zawsze chciałem wiedzieć, jak zaprogramować tyle i nic, jestem raczej osłem!
Nie obwiniaj siebie, nie jesteś osłem. Po pierwsze, nie wszyscy programiści wiedzą, jak napisać jądro, jest to bardzo mało proste zadanie, aw praktyce jest większe. Na przykład tutaj autor tworzy ogólne sterowniki dla klawiatury i ekranu, manipulując tablicą screen, co jest metodą, która nie jest dziś w ogóle używana. Tty w dzisiejszym Linuksie są bardzo, bardzo złożone i nie zależą od architektury x86, która ma do swojej dyspozycji tablicę ekranową. Ponadto, znaczna część kodu w C zależy od architektury, kiedy ideałem jest stworzenie kodu architektury w asemblerze, a kod C działa na dowolnym procesorze. Nie odwracam jednak uwagi od autora, ponieważ jądro uzyskuje cechy, które dziś uważamy za normalne w jądrze Linuksa, na przykład nie jest to łatwe zadanie i można być pewnym, że pojedyncza osoba nie jest w stanie tego zrobić. W przypadku czegoś, duże projekty, takie jak linux, gcc, glibc itp., Nie są tworzone przez jedną osobę, ale jest wielu współpracowników.
Ponadto, jeśli chcesz rozpocząć programowanie, masz w sieci sporo poradników, chociaż musisz być ostrożny i wybrać dobre poradniki. Zacząłem programować w Linuksie wskakując do basenu głową i bez wody (czyli z ukochanym językiem C), chociaż teraz mam kilka podstawowych pojęć z Pythona (który jest również bardzo dobrym językiem). Jest kilka książek C, w których na stronie 6 rezygnujesz z bólu głowy, ale bardziej niż książki te rzeczy są nabywane z doświadczenia. Dzieje się tak jak w modelu sieciowym OSI. Dokumentacja dotycząca modelu OSI jest absolutnie niemożliwa do zrozumienia dla nowicjusza, ale jeśli znajdziesz witrynę z dobrym objaśnieniem warstw sieci, szybko zdobędziesz koncepcje dotyczące dokumentów technicznych, takich jak RFC.
Krótko mówiąc, istnieją dobre strony internetowe i podręczniki, trzeba się do tego zabrać i znaleźć dobry materiał.
pozdrowienia
Witam, po tak trudnych próbach rozwiązania problemu „błąd: nie znaleziono nagłówka multiboot”. i „błąd trzeba najpierw załadować jądro”, ponieważ nigdzie nie mogłem znaleźć rozwiązania problemu z pierwszego artykułu, który mieli niektórzy tacy jak ja ... tutaj jest rozwiązanie, jeśli to działa dla kogoś ...
Nie wiem, czy moja teoria przyczyny błędu jest poprawna ale tak czy owak pytanie brzmi, że kompilując pliki w 32-bitowym systemie operacyjnym nie wygenerował błędu, ale skoro mam 64-bitowy działający system (Gnu / Linux Debian 7) i że podczas kompilacji i testowania wyskoczył mi błąd "nie znaleziono nagłówka multiboot" i jest wątpliwość, to moim zdaniem błąd wynika ze środowiska lub architektury systemu operacyjnego w którym kompilujemy nasze pliki ... i cóż, skompilowałem moje pliki, określając środowisko lub architekturę 32-bitową.
* sudo jako -o kernel.o -c kernel.asm -32
* sudo gcc -o NastępnyKernel_Main.o -c NastępnyKernel_Main.c -nostdlib -fPIC -ffreestanding -m32
* sudo gcc -m32 -o START.ELF jądro.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -ffreestanding
Dziwne jest to, że mam pewne wątpliwości hahaha, to system operacyjny, który tworzymy krok po kroku jest dla architektury x86, czy się mylę ajajaj….
PS: ktoś, kto pomoże mi z wątpliwościami i usprawiedliwi niektóre błędy ortograficzne lub mój zły wyraz twarzy, i cóż, nie jestem doskonały, więc «Perfekcja ma swoją cenę»…. A co najważniejsze, emuluj 32-bitowy system operacyjny, święte rozwiązanie … .Hahaha
Geniusz! Naprawdę chciałem zrobić ten samouczek i na początku zszedłem z tym błędem haha
Gratulacje, to wspaniały wkład. Od teraz dzielę się z wami tym, że wasze dobre dzieło przeze mnie i innych będzie przedłużone;
pozdrowienia