Емулиране на Linus Torvalds: създайте своя собствена операционна система от нулата (VII)

Добре дошли в друга публикация за как да създадем наша собствена операционна система (Предишни статии от поредицата: 1, 2, 3, 4, 5 y 6). Измина доста време от последния пост, главно поради грешка, която открих в това, което имаме днес. Ще видим как да се справя с часовника на x86 архитектури.

Преди това бяхме активирали IRQ по общ начин, но имаше малък проблем, тъй като не ги активирахме правилно и предадохме допълнителни данни. Най-накрая го оправяме карлосорта и аз и аз можем да продължим да коментираме как да продължим.

Е, часовникът е IRQ, по-специално първият. За да го конфигурираме, ще използваме функцията, която дефинирахме по-горе, за да инсталираме като цяло IRQs, ND_IRQ_InstallHandler.

int ND_TIMER_TICKS = 0; void ND :: Таймер :: Фаза (int hz) {int делител = 1193180 / hz; ND :: Портове :: OutputB (0x43,0x36); ND :: Портове :: OutputB (0x40, делител & 0xFF); ND :: Портове :: OutputB (0x40, делител >> 8); } void ND :: Timer :: Wait (int ticks) {неподписани дълги етикети; eticks = ND_TIMER_TICKS + отметки; while (ND_TIMER_TICKS <eticks) {void ND :: Timer :: Setup () {ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BLACK); ND :: Screen :: PutString ("\ nТаймер за настройка ..."); ND_IRQ_InstallHandler (0, & ND_Timer_Handler); ND :: Екран :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_GREEN); ND :: Екран :: PutString ("готово"); } 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 :: Екран :: PutString ("\ nОще една секунда"); ТРЯБВА ДА НАПРАВИМ ОНОВЯВАЩ ЕКРАН}}

Кодът работи по следния начин: системните извиквания за инициализация ND :: Таймер :: Настройка, който се обажда ND_IRQ_InstallHandler за да вмъкнете на първо място IRQ0, функция за обратно извикване, когато настъпи събитието, т.е. ND_Timer_Handler това увеличава кърлежи. Тъй като сме задали тактовата честота на 18 Hz, както ще видим по-късно, ако я разделим на 18 и ни даде цяло число, щеше да мине секунда.

Функцията ND :: Таймер :: Фаза Помага ни да регулираме скоростта на таймер, това екстравагантно число е 1.19 MHz, което е обща стойност. Е, трябва да извикаме тази функция, ако искаме да променим скоростта на таймер, по подразбиране тя достига до 18,22 Hz, особена стойност, която някой трябва да е решил в рамките IBM и това е останало и до днес.

Функцията ND :: Таймер :: Изчакайте това е доста просто, просто изчакайте с цикъл докато докато кърлежи необходимо да продължи.

На изображението можем да видим, че ако коментираме кода в ND_Timer_Handler, получаваме следното:

Секунди в NextDivel

В следващата глава ще видим как да четем въвеждането от клавиатурата и да направим малко черупка за взаимодействие с нашата система. Както винаги, кодът се предлага в GitHub по лиценза GNU GPL v2.


Оставете вашия коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *

*

*

  1. Отговорен за данните: Мигел Анхел Гатон
  2. Предназначение на данните: Контрол на СПАМ, управление на коментари.
  3. Легитимация: Вашето съгласие
  4. Съобщаване на данните: Данните няма да бъдат съобщени на трети страни, освен по законово задължение.
  5. Съхранение на данни: База данни, хоствана от Occentus Networks (ЕС)
  6. Права: По всяко време можете да ограничите, възстановите и изтриете информацията си.

  1.   Ной каза той

    Много интересна поредица от уроци, лично аз не бях виждал много за създаването на Linux дистрибуция от нулата, а още по-малко на испански и толкова завършен. Вярвам, че много неща могат да се научат с това и щом имам време, се надявам да успея да направя тези уроци.
    Всичко, което искам, е да не се обезсърчавате и да завършите урока, тъй като намерих много добри уроци, които никога не са завършени.
    Поздрави и благодарности :).

    1.    пътник каза той

      Това не е Linux дистрибуция, а ядро ​​😛.

    2.    десикодер каза той

      Грешиш. Създаването на дистрибуция на Linux не означава програмиране на нищо, например в линукс от нулата не програмирате, това, което правите, е да инсталирате (въз основа на компилирането), основни пакети, които съставляват дистрибуция. Това е съвсем различно. Създава ваша собствена операционна система. Няма нищо общо с linux. Това направиха по негово време торвалдите, вдъхновени от minix, и с тази разгорещена и популярна дискусия между torvalds и andrew s. tanenbaum върху монолитно ядро ​​срещу микроядро.

      Saludos!

  2.   илюки каза той

    Благодаря че. Досега не съм обръщал много внимание на публикацията ви, но съм в проект, така че ще ги разгледам.
    Поздрави.

  3.   пътник каза той

    Заслужава да се спомене, че могат да се използват и други езици, като Objective-C (++), C ++, D или Rust.

    1.    AdrianArroyoStreet каза той

      Този е в C ++, а не в C. Трудно е обаче да се видят разликите, тъй като много оператори на C ++ изискват библиотечно обезпечение, като например операторите new и delete. Би било много интересно да се направи операционна система в Rust. Всъщност има IRC канал, посветен на операционните системи на Rust (# rust-osdev на irc.mozilla.net). Всеки, който компилира в машинен код, наистина си заслужава, включително Java, ако използваме GCJ.

      1.    пътник каза той

        Да, наистина, Rust е много интересен език за операционните системи, защото не само е по-лесен за учене от C или C ++ (все още продължава с непрекъснати промени, но е и по-лесен), но е и много по-сигурен.

  4.   пътник каза той

    През 70-те години беше доста често да се програмира директно на хардуера, без операционна система.

  5.   Кристофър каза той

    Отлично ... сега просто трябва да разбера: 3 ...

  6.   ммм каза той

    Здравей Благодаря ви много за тези статии. Но ако нямам познания по програмиране, не мисля, че трябва да го правя, нали? Искам да кажа, ако не би било „добро, а сега какво да копирам и поставя?“ ... каква жалка, винаги съм искал да знам как да програмирам толкова много и нищо, аз съм по-скоро магаре!

    1.    десикодер каза той

      Не се обвинявайте, вие не сте магаре. Като начало, не всички програмисти знаят как да пишат ядро, това е много малка проста задача, а на практика е по-голяма. Например тук авторът създава общи драйвери за клавиатурата и екрана, манипулирайки масива на екрана, което е метод, който изобщо не се използва днес. Днес tty в linux са много, много сложни и не зависят от архитектурата x86, която разполага с масив от екрани. В допълнение, голяма част от кода в C зависи от архитектурата, когато идеалното е да се направи архитектурен код в асемблер и че C кодът работи във всеки процесор. Аз обаче не накърнявам автора, тъй като ядрото придобива характеристиките, които днес считаме за нормални в ядрото на Linux, например, това не е лесна задача и бъдете сигурни, че един човек е абсолютно неспособен да го направи. За нещо големите проекти като linux, gcc, glibc и т.н. не се правят от един човек, но има много сътрудници.

      Освен това, ако искате да започнете програмирането, имате доста ръководства в мрежата, въпреки че трябва да внимавате и да изберете добрите ръководства. Започнах да програмирам в Linux, скачайки в басейна с глава и без вода (т.е. с обичания език C), въпреки че сега имам някои основни понятия за python (който също е много добър език). Има някои C книги, в които се отказвате на стр. 6 от главоболието, което получавате, но повече от книгите тези неща се придобиват от опит. Това се случва както при мрежовия модел OSI. Документацията за модела osi е абсолютно невъзможна за разбиране за новодошлия, но ако намерите сайт с добро обяснение на мрежовите слоеве, бързо получавате концепциите за справяне с технически документи като RFC.

      Накратко, че там има добри уебсайтове и ръководства, е въпрос да стигнете до него и да намерите добър материал.

      поздрави

  7.   Безплатна_ДОМ каза той

    Здравейте, след всички опити за разрешаване на „грешка: не е намерен заглавен файл с много стартиране“. и «грешка, първо трябва да заредите ядрото», тъй като никъде не можах да намеря решението на проблема от първата статия, което имаха някои като мен ... ето решението, ако работи за някого ...

    Не знам дали моята теория за причината за грешката е правилна, но така или иначе, въпросът е, че при компилиране на файловете в 32-битова операционна система не е генерирала грешката, но тъй като имам 64-битова операционна система (Gnu / Linux Debian 7), и че при компилиране и тестване изхвърлих грешката „не е намерен мулти-стартиращ хедър“ и има съмнение, тогава според мен грешката се дължи на средата или архитектурата на операционната система в който ние компилираме нашите файлове ... и това, което направих, е да компилирам файловете си, като посочих 32-битовата среда или архитектура ..
    * sudo като -o kernel.o -c kernel.asm -32
    * sudo gcc -o NextKernel_Main.o -c NextKernel_Main.c -nostdlib -fPIC -ffreestanding -m32
    * sudo gcc -m32 -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -freestanding
    Странното е, че имам някои съмнения хахаха, тогава операционната система, която създаваме стъпка по стъпка, е за архитектура x86 или греша ajajaj ....

    PS: някой, който да ми помогне със съмнението и да извини някои правописни грешки или лошия ми израз, и аз не съм перфектен, така че «Perfection има своята цена» ... И най-важното, емулирайте 32-битова операционна система, свято решение … .Хахаха

    1.    Мартин Вилалба каза той

      Гений! Наистина исках да направя този урок и в началото слязох с тази грешка хаха

  8.   "Оскар" каза той

    Поздравления, това е отличен принос. Отсега нататък споделям с вас, че вашата добра работа чрез мен и другите ще бъде удължена;

    поздрави