Емуляція Лінуса Торвальдса: створіть власну операційну систему з нуля (VII)

Ласкаво просимо до чергової публікації про як створити власну операційну систему (Попередні статті серії: 1, 2, 3, 4, 5 y 6). З часу останньої публікації минуло багато часу, головним чином через помилку, яку я знайшов у тому, що ми маємо сьогодні. Побачимо як поводитися з годинником на архітектурі x86 -.

Раніше ми активували IRQ загальним чином, але була невелика проблема, оскільки ми не активували їх правильно, і ми передали додаткові дані. Ми нарешті це виправляємо карлосорта і я, і я можу продовжувати коментувати, як продовжувати.

Ну, годинник - це IRQ, конкретно перший. Для його налаштування ми будемо використовувати функцію, яку ми визначили раніше, для загальної установки IRQ, ND_IRQ_InstallHandler.

int ND_TIMER_TICKS = 0; void ND :: Timer :: Phase (int hz) {int divisor = 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 :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_GREEN); ND :: Screen :: 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 :: Screen :: PutString ("\ nЩо більше секунди"); МИ ПОВИННІ РОБИТИ ОНОВЛЕНИЙ ЕКРАН}}

Код працює наступним чином: системні виклики ініціалізації ND :: Таймер :: Налаштування, який дзвонить ND_IRQ_InstallHandler щоб вставити в перше місце IRQ0, функцію зворотного виклику, коли відбувається подія, тобто ND_Timer_Handler що збільшує кліщі. Оскільки ми встановили тактову частоту 18 Гц, як ми побачимо пізніше, якби ми поділили її на 18 і дали нам ціле число, минула б секунда.

Функція ND :: Таймер :: Фаза Це допомагає нам регулювати швидкість таймер, це екстравагантне число становить 1.19 МГц, що є загальним значенням. Ну, ми повинні викликати цю функцію, якщо хочемо змінити швидкість таймер, за замовчуванням воно дорівнює 18,22 Гц, своєрідне значення, яке, мабуть, вирішив хтось 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. Це те, що робив свого часу Торвальдс, натхненний мініксом, і з цим бурхливим і популярним обговоренням між Торвальдами та Ендрю. таненбаум на монолітному ядрі проти мікроядра.

      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, яка має у своєму розпорядженні масив екрану. Крім того, велика частина коду С залежить від архітектури, коли ідеальним є створення архітектурного коду в асемблері, а також те, що код С працює на будь-якому процесорі. Однак я не принижую автора, оскільки те, що ядро ​​набуває характеристик, які сьогодні ми вважаємо нормальними для ядра Linux, наприклад, це непросте завдання, і ви можете бути впевнені, що одна людина абсолютно не здатна це зробити. Для чогось великі проекти, такі як Linux, gcc, glibc тощо, не створюються однією особою, але є багато співавторів.

      Крім того, якщо ви хочете розпочати програмування, у вас є досить багато посібників в Інтернеті, хоча ви повинні бути обережними і вибрати хороші посібники. Я почав програмувати на Linux, стрибаючи в басейн з головою і без води (тобто з улюбленою мовою C), хоча зараз у мене є деякі основні поняття python (який також є дуже гарною мовою). Є кілька книг на мові C, в яких ви відмовляєтесь на стор. 6 від головної болі, яку отримуєте, але більше, ніж книги, ці речі набуваються досвідом. Це трапляється, як із моделлю мережі OSI. Документацію щодо моделі osi абсолютно неможливо зрозуміти для новачка, але якщо ви знайдете сайт з хорошим поясненням мережевих рівнів, ви швидко отримаєте концепції щодо роботи з технічними документами, такими як RFC.

      Коротше кажучи, є хороші веб-сайти та посібники, це питання зайнятися цим і знайти хороший матеріал.

      привіт

  7.   Free_DOM - сказав він

    Привіт, після таких зусиль, щоб вирішити "помилку: багатозавантажувальний заголовок не знайдено". і «помилка, вам потрібно спочатку завантажити ядро», оскільки я ніде не міг знайти рішення проблеми першої статті, яке було у таких, як я ... ось рішення, якщо це комусь вдається ...

    Я не знаю, чи правильна моя теорія причини помилки, але в будь-якому випадку, питання полягає в тому, що при компіляції файлів у 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 -стоячий -m32
    * sudo gcc -m32 -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -стоячий
    Дивна річ у тому, що я маю певні сумніви ха-ха-ха, тоді операційна система, яку ми створюємо поетапно, для архітектури x86, або я помиляюся ajajaj….

    PS: Хтось, хто допоможе мені з сумнівами і вибачить деякі орфографічні помилки чи моє погане вираз, і я не ідеальний, тому "Досконалість має свою ціну" ... І найголовніше, наслідуйте 32-бітну операційну систему, святе рішення … .Ха-ха-ха

    1.    Мартін Віллалба - сказав він

      Геній! Я дуже хотів зробити цей підручник, і я відмовився від початку з цією помилкою ха-ха

  8.   Оскар - сказав він

    Вітаю, це чудовий внесок. Відтепер я поділяю з вами, що ваша добра робота через мене та інших буде продовжена;

    привіт