четверг, 25 июля 2013 г.

PhantomEx: VMware + gdb + eclipse

"Если ваш единственный инструмент — молоток, то каждая проблема становится похожей на гвоздь".

Абрахам Маслоу


Так вот в нашем ремесле настала пора заменить молотки на что-то более хирургически точное.

До сих пор мы использовали в качестве "среды" разработки обычный текстовый редактор, для сборки проекта - утилиту make, а отлаживали исключительно путем запуска нашего ядра на виртуальной машине QEMU.

Но наступает момент когда объем кода и сложность алгоритма становятся такими, что этим минимальным набором уже не обойтись. Давайте настроим для нашего проекта среду разработки и отладки.


вторник, 16 июля 2013 г.

PhantomEx: Программируемый интервальный таймер

За прошедшее с начала цикла время мы достаточно серьезно продвинулись вперед: наше "игрушечное" ядро знает о сегментной организации памяти, и предоставляет возможности для обработки прерываний в защищенном режиме.

Следующим нашим шагом будет, во-первых, демонстрация работоспособности механизма обработки аппаратных прерываний, а во-вторых - изучение ещё одной важной железяки - программируемого интервального таймера - PIT.

Для чего системе нужен таймер? Позвольте, а как мы будем реализовывать многозадачность? Ведь многозадачность в однопроцессорной системе (о многопроцессорных мы пока и не заикаемся) - это просто разделенное во времени выполнение нескольких процессов на единственном процессоре. Значит нам необходим инструмент, чтобы это самое время измерять.

Кроме того, если бы мы говорили об операционной системе жесткого реального времени (ОСРВ), так там вообще требуется обеспечивать гарантированный отклик любой задачи в течении строго фиксированного временного промежутка. В случае отсутствия такого отклика система должна принять по отношению к этой уже "мертвой" с её точки зрения задаче соответствующие меры. И тут тоже не обойтись без измерения временных интервалов.

Поэтому, как всегда, начнем с теории.

понедельник, 15 июля 2013 г.

PhantomEx: Обработка аппаратных прерываний

Работа процессора в одиночестве бессмысленна сама по себе. Есть множество периферийных устройств, выполняющих различные функции, с которыми необходимо осуществлять информационный обмен.

Работа процессора с внешними устройствами происходит с помощью друх схем
  • Периодический опрос
  • Работа по прерыванию
Периодический опрос имеет смысл при небольшом числе обслуживаемых устройств, но применяется он в основном в тех случаях, когда процессор не поддерживает механизма обработки прерываний (довольно много моделей промышленных микроконтроллеров).

Механизм обслуживания устройства по прерыванию во многих случаях оказывается наиболее предпочтителен. Если устройств много, их опрос может занимать приличное время, да и иногда он бывает затруднен большой ресурсоемкостью алгоритмов, не связанных с работой внешних устройтств.

Был в моей практике электровозный дисплейный блок Gersys, под управлением MS DOS, который обслуживал контролер CAN-шины именно используя обработку прерываний, иначе сделать было просто нельзя. Вообще же выполнение "фоновых" задач в однозадачной ОС не обходится без использования прерываний.

Процессоры семейства x86 физически имеют один единственный вход для приема запросов прерываний от внешних устройств. Поэтому для мультиплексирования этого сигнала от многих устройств совместно с процессором использовался программируемый контролер прерываний - PIC. Вместе с сигналом запроса прерывания от контролера процессору передается так же вектор прерывания, то есть адрес его обработчика. Рассмотрим этот процесс более детально


PhantomEx: Прерывания защищенного режима

В архитектуре процессоров x86 предусмотрены особые ситуации, когда процессор прекращает выполнение текущей программы и немедленно передает управление программе-обработчику, специально созданной для обработки подобной ситуации.

Такие особые ситуации делятся на два типа: прерывания и исключения, в зависимости от того что вызвало эту ситуацию - запрос внешнего устройства или команда, выполняемая самим процессором.

Исключения в свою очередь делятся на ошибки, ловушки и остановы
  • Ошибки - проявляются перед выполнением команды, поэтому обработчик такого исключения получит в качестве адреса возврата адрес ошибочной команды.
  • Ловушки - происходят сразу после выполнения команды, так что обработчик получит в качестве адреса возврата адрес следующей команды. 
  • Остановы - могут происходить в любой момент и вообще не предусматривать средств возврата управления в программу. 
Адреса обработчиков прерываний в реальном режиме располагаются в самом начале адрессного пространства по адресу 0x0000:0x0000. Каждый элемент этой таблицы представляет собой дальний адрес обработчика прерываний в формате сегмент:смещение, или четыре нулевых байта, если обработчик не установлен - так называемая таблица векторов прерываний.

В защищенном режиме всё немного иначе и сложнее. Рассмотрим всё по порядку.

воскресенье, 14 июля 2013 г.

PhantomEx: Исходники учебных примеров

Таки настал момент выложить код нашей учебной операционной системы в разделе Загрузки.

Исходники тщательно проверены и отлажены по мере написания статей блога.

PhantomEx: Сегментная адресация в защищенном режиме

Мы уже обзавелись достаточным инструментарием для того чтобы начать заниматься организацией работы нашей операционной системы. Прежде всего нам необходимо озаботится созданием механизмов работы с памятью в защищенном режиме. 

Начнем с того, что загрузившись с помощью GRUB2 мы уже находимся в защищенном режиме с включенной сегментной адресацией. Беда только в том, что основные структуры для работы с сегментной памятью созданы загрузчиком без нашего ведома, расположены они неизвестно где, их состав и настройки для нас тайна. А это крайне неприятно - мы должны полностью отдавать себе отчет в том что происходит в нашей системе.

Поэтому сегментную адресацию придется организовать заново. И организуем мы её для того... чтобы практически не использовать! Дело в том что данный механизм является рудиментарным и не используется в современных операционных системах. В архитектуре x86-64 была предпринята попытка совсем отказаться от этой модели, однако проблемы с реализацией аппаратной виртуализации на этой платформе (использующей сегментную модель) вынудили разработчиков AMD вернуть данную схему в ограниченном виде.

Так что мы создадим сегментную память для того чтобы сразу прыгнуть в режим страничной адресации.

суббота, 13 июля 2013 г.

PhantomEx: Программирование видеопамяти

Следующее, чему должно научится ядро - выводить на экран данные: текстовые сообщения и числовые значения. Без этой возможности понять что происходит при работе системы будет крайне непросто, если не сказать что невозможно.

Каким образом можно организовать вывод? Программируем мы на C и в C есть функция printf(...) для организации форматированного вывода. Ага, не тут то было! Ничего у нас не выйдет.

Стандартые библиотеки C мы не используем, да и смысл они имеют при работе в среде какой-нибудь работающей операционной системы, так как используют системные вызовы. Так что printf(...) или любого другого его аналога у нас нет.

Следующее что приходит на ум - функции BIOS для вывода символов на экран. Тут мы тоже терпим фиаско - функции BIOS не доступны в защищенном режиме процессора Intel. А мы находимся именно в защищенном режиме, нас туда перевел GRUB2.

Остается только один вариант - использование видеопамяти и создание собственных функций вывода информации на экран

среда, 10 июля 2013 г.

Что такое указатели и как с ними работать

Тема указателей настолько широко раскручена, имеется столько различных учебников и интернет-статей по их поводу, что даже не знаю, стоит ли мне влезать в неё.

Очевидно стоит, так как мы ступили на нелегкий путь программирования во враждебной, практически лишенной всяческой программной оболочки (если не считать BIOS и GRUB) среде. И здесь указатели обретают несколько более важное значение, чем при прикладном программировании, где они умирают, благодаря разнообразным надстройкам и фреймворкам, скрывающим от программиста работу с динамической памятью. И уж никто из прикладников почти не задумывается о том чтобы работать с памятью напрямую.

Поэтому предлагаю ещё одну статью. Если предыдущая была подобием лабораторной работы, то это - чистая лекция

PhantomEx: Взгляд внутрь ядра

В предыдущей статье мы настроили загрузчик и убедились в работоспособности "игрушечного" ядра. И прежде чем продолжить путь "осеписателя", ещё немного поколдуем с имеющейся у нас заготовкой.

Речь идет о том, чтобы заглянуть внутрь сгенерированного компилятором кода, пока его не слишком уж много, и уяснить для себя во что конкретно превращаются исходные тексты в итоге. И если для прикладного программиста такое занятие может и пустая трата времени, то для системного - наоборот, приобретение необходимого опыта.

Воспользуемся редактором HT-editor для того чтобы изучить бинарный файл kernel, а так же дизассемблируем его, чтобы посмотреть структуру сгенерированного кода.

PhantomEx: Приручаем GRUB2 - установка и загрузка ядра

Теперь у нас есть скомпилированное примитивное ядро, поддерживающее однако спецификацию Multiboot. Или нам кажется что оно её поддерживает. Так давайте проверим это.


PhantomEx: Спецификация Multiboot - делаем заготовку ядра

Итак, настал момент написать что-то похожее на ядро операционной системы. Как я уже говорил, наше ядро будет запускаться загрузчиком GRUB2, а для этого ему необходимо удовлетворять некоторым требованиям.

1. Спецификация мультизагрузки.

 

В настоящее время GRUB2 поддерживает две версии спецификации мультизагрузки: Multiboot и Multiboot2. Полностью с ними можно ознакомится по приведенным ссылкам, нам это не требуется пока, и чтобы не загромождать заметку, приведу лишь те первоначальные сведения, которые позволят нам стартовать.

вторник, 9 июля 2013 г.

PhantomEx: Готовим почву (создание образа HDD и установка загрузчика GRUB2)

Начинать мы будем с того, что определимся откуда будет грузится наше ядро. В большинстве руководств по написанию ОС, блуждающих в сети этот вопрос решается довольно просто: образ ядра вместе с загрузчиком жестко "вшивается" в образ дискеты, которая затем устанавливается в виртуальную машину. 
Кроме того, многие HOW-TO обладают тем недостатком, что начинаются с описания создания загрузчика для самодельной ОС.

Кроме образовательного эффекта - изучения принципов работы BIOS и порядка загрузки ОС такой подход не имеет других достоинств. Кроме того, ваша ОС будет не приспособлена для совместного проживания с другими ОС (одна ОС известной фирмы тоже этим грешит ;) ).
Поэтому сделаем всё основательно - создадим образ жесткого диска, разобьем его на разделы и установим на него загрузчик GRUB2. Так чтобы наше ядро с детства училось жить в разделе жесткого диска и грузится используя спецификацию Multiboot или Multiboot2.
Что для этого понадобится?

PhantomEx: Набор инструментальных средств

Сразу скажу что написание ОС в среде операционной системы Windows - это достаточно сложное знанятие, в виду разнородности средств и трудности их сопряжения между собой.

В качестве основной платформы для начала разработки автором выбран дистрибутив Arch Linux. Почему арч - да просто потому что он установлен на моем домашнем компьютере. В Вашем случае подойдет любой другой дистрибутив.

четверг, 4 июля 2013 г.

PhantomEx: первые признаки жизни

Уж не знаю, что из этого получится, но тем не менее, оно загрузилось с помощью GRUB2 и вывело скромное сообщение.