Эмуляция Линуса Торвальдса: создайте свою собственную операционную систему с нуля (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 :: Ports :: OutputB (0x43,0x36); ND :: Ports :: OutputB (0x40, делитель & 0xFF); ND :: Ports :: OutputB (0x40, делитель >> 8); } void ND :: Timer :: Wait (int ticks) {unsigned long eticks; eticks = ND_TIMER_TICKS + тики; а (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 :: Timer :: Setup, который вызывает ND_IRQ_InstallHandler чтобы вставить в первую позицию IRQ0, функцию обратного вызова при возникновении события, то есть ND_Timer_Handler что увеличивает клещи. Поскольку мы установили тактовую частоту на 18 Гц, как мы увидим позже, если бы мы разделили ее на 18 и дали нам целое число, прошла бы секунда.

Функция НД :: Таймер :: Фаза Это помогает нам регулировать скорость таймер, это экстравагантное число составляет 1.19 МГц, что является обычным значением. Что ж, эту функцию следует вызывать, если мы хотим изменить скорость таймер, по умолчанию это 18,22 Гц, особенное значение, которое кто-то должен был решить в пределах IBM и осталось по сей день.

Функция ND :: Timer :: Wait это довольно просто, просто подождите с петлей в то время как до клещи необходимо продолжить.

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

Секунды в NextDivel

В следующей главе мы увидим, как читать ввод с клавиатуры и немного оболочка для взаимодействия с нашей системой. Как всегда, код доступно в GitHub по лицензии Лицензия GNU GPL v2.


Оставьте свой комментарий

Ваш электронный адрес не будет опубликован. Обязательные для заполнения поля помечены *

*

*

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

  1.   Ной сказал

    Очень интересная серия руководств, лично я не много видел о создании дистрибутива Linux с нуля, и тем более на испанском языке и так полно. Я думаю, вы можете многому научиться из этого, и как только у меня будет время, я надеюсь, что смогу делать эти уроки.
    Единственное, о чем я прошу, это не расстраиваться и заканчивать обучение, так как я нашел много хороших руководств, которые никогда не заканчиваются.
    Привет и спасибо :).

    1.    путешественник сказал

      Это не дистрибутив Linux, это ядро ​​😛.

    2.    десикодер сказал

      Ты не прав. Создание дистрибутива linux не подразумевает ничего программирования, например, в linux с нуля вы не программируете, вы просто устанавливаете (на основе компиляции) базовые пакеты, из которых состоит дистрибутив. Это совсем другое. Это создание вашей собственной операционной системы. Это не имеет ничего общего с Linux. Это то, что Торвальдс делал в свое время, вдохновленный minix, и горячие и популярные дискуссии между Торвальдсом и Эндрю С. Таненбаум о монолитном ядре против микроядра.

      Saludos!

  2.   Illukki сказал

    Спасибо че. До сих пор я не обращал особого внимания на ваш пост, но я участвую в проекте, поэтому я собираюсь взглянуть на них.
    Привет.

  3.   путешественник сказал

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

    1.    АдрианАрройоУлица сказал

      Это в 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 as -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 -ffreestanding
    Странно то, что у меня есть некоторые сомнения, хахаха, тогда операционная система, которую мы создаем шаг за шагом, предназначена для архитектуры x86, или я ошибаюсь, ajajaj….

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

    1.    Мартин Вильяльба сказал

      Гений! Я действительно хотел сделать этот урок и вначале закончил с той ошибкой, ха-ха

  8.   Оскар сказал

    Поздравляю, это отличный вклад. С этого момента я делюсь с вами тем, что ваша хорошая работа через меня и других будет расширяться;

    привет