Emulowanie Linusa Torvaldsa: stwórz swój własny system operacyjny od podstaw (VII)

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:

Sekundy w NextDivel

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.


Zostaw swój komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

*

*

  1. Odpowiedzialny za dane: Miguel Ángel Gatón
  2. Cel danych: kontrola spamu, zarządzanie komentarzami.
  3. Legitymacja: Twoja zgoda
  4. Przekazywanie danych: Dane nie będą przekazywane stronom trzecim, z wyjątkiem obowiązku prawnego.
  5. Przechowywanie danych: baza danych hostowana przez Occentus Networks (UE)
  6. Prawa: w dowolnym momencie możesz ograniczyć, odzyskać i usunąć swoje dane.

  1.   Noe powiedział

    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 :).

    1.    drogowy powiedział

      To nie jest dystrybucja Linuksa, to jądro 😛.

    2.    dezykoder powiedział

      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!

  2.   Illuki powiedział

    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.

  3.   drogowy powiedział

    Warto wspomnieć, że można używać innych języków, takich jak Objective-C (++), C ++, D lub Rust.

    1.    AdrianArroyoStreet powiedział

      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.

      1.    drogowy powiedział

        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.

  4.   drogowy powiedział

    W latach 70. dość powszechne było programowanie bezpośrednio na sprzęcie, bez systemu operacyjnego.

  5.   Christopher powiedział

    Świetnie ... teraz muszę tylko zrozumieć: 3 ...

  6.   mmm powiedział

    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!

    1.    dezykoder powiedział

      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

  7.   Wolność powiedział

    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

    1.    Marcin Villalba powiedział

      Geniusz! Naprawdę chciałem zrobić ten samouczek i na początku zszedłem z tym błędem haha

  8.   Oscar powiedział

    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