Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Разработка операционных систем - для начинающих и не только!


Информационный Канал Subscribe.Ru


Выпуск 3

Часть первая, практическая

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

В предыдущем выпуске я сказал, что BIOS - это программа, которая запускается при старте компьютера. Но обязанности BIOS не ограничиваются инициализацией и настройкой аппаратуры компьютера. BIOS также предоставляет интерфейс для доступа к аппаратной части, который гораздо проще чем программирование через порты ввода-вывода (о них позже). В этом отношении BIOS можно рассматривать как... правильно! Как операционную систему. У этой ОС есть множество недостатков, но и одно серьезнейшее преимущество - она установлена на всех IBM PC-совместимых компьютерах. А это значит, что мы можем смело использовать предоставляемые BIOS высокоуровневые (которые в тоже время очень низкоуровневы даже в сравнении с системными функциями DOS) функции не опасаясь потерять совместимость с разными моделями компьютеров. Конечно у разных BIOS существуют и несовместимые функции, но практически все, что нам понадобится, будет совместимо с компьютерами от IBP PC XT c 8086 процессором до современных с Pentium 4.

Для вызова функций BIOS используется механизм т.н. программных прерываний. По сути дела, программное прерывание (инструкция INT) - это просто вызов некоторой функции (аналогично инструкции CALL) с тем лишь отличием, что в инструкции CALL адрес указывается напрямую (регистр/переменная/непосредственный операнд), а адрес, по которому будет осуществлен переход инструкцией INT, хранится в таблице прерываний (о ней тоже попозже). Как операнд, в инструкции INT указывается индекс (номер) прерывания в таблице. При выполнении инструкции процессор достает из таблицы адрес, соответствующий указанному индексу прерывания, помещает в стек содержимое регистров EFLAGS (FLAGS в 16-битном режиме), CS, EIP (IP) и передает управление по полученному адресу. Например:
int 0x10 - вызов обработчика прерывания номер 0x10

Вводная часть на этом завершена, теперь давайте рассмотрим нашу программу:
[ORG 0x7C00] - BIOS загружает первый сектор дискеты по адресу 0x0000:0x7C00 и смещение всех меток программы должны вестись от этого адреса
Соответственно в сегментном регистре CS находится 0. Содержимое остальных сегментных регистров не определено, и мы загружаем во все нужные нам сегментные регистры то же значение, что находится в CS:
mov ax, cs
mov ds, ax
mov ss, ax

(при этом не забываем перед установкой стека отключить прерывания инструкцией CLI)
Теперь нам необходимо инициализировать регистр стека SP (именно SP, а не ESP, так как мы сейчас находимся в 16-битном режиме)

mov sp, _start - метка _start находится в самом начале нашей программы, т.е. стек будет располагаться прямо под ней (напоминаю, что стек растет сверху вниз)

После установки стека мы разрешаем прерывания, устанавливая флаг IF командой STI

В функции kputs мы используем прерывание видеосервиса BIOS int 0x10, которое предназначена для управления видеоадаптером, в том числе и для вывода текста на экран.
Номер функции этого прерывания помещается в регистр AH, мы используем функцию номер 0x0E, которая выводит на экран ASCII-символ, находящийся в регистре AL. Например программа:
mov ah, 0x0E
mov al, 'Z'
int 0x10

Выведет на экран символ 'Z'
Ну а наша функция kputs предназначена для вывода на экран строки символов (указатель на которую передается в регистре SI). Заканчиваться эта строка должна нуль-символом.

Для того, чтобы BIOS могла распознать загрузочный сектор, он должен заканчиваться (байты 510-511) байтами 0x55, 0xAA, для осуществления этого и предназначены последние две строчки программы. Хотя для некоторых BIOS наличие такой сигнатуры необязательно

Часть вторая, теоретическая

Эволюция операционных систем

Операторы - "живые" операционные системы 50х годов не могли управляться с компьютером слишком быстро, и поэтому много времени проходило между остановом одной программы и запуском другой, между запросом компьютера на выделение ресурсов и его удовлетворением и пр. Как следствие, компьютеры большую часть времени простаивали в ожидании действий оператора. Тогда возникла идея - передать функции оператора самому компьютеру! Большинство функций оператора сводилось к рутинной работе, поэтому запрограммировать их не составляло труда.

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

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

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

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

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

Следующим этапом развития операционных систем стали сетевые операционные системы во главе с UNIX; о них мы поговорим в следующих раз


Как всегда, мой почтовый ящик открыт для вас: lonesome@lowlevel.ru
Также вы можете задавать интересующие вас вопросы в форуме lowlevel.ru
Всего наилучшего!
Lonesome


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное