четверг, 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.

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