Rambler's
Top100

Разработка операционных систем. Выпуск 2

Автор: lonesome [TSH/Digital Daemons]
Дата: 26.05.2003
Раздел: Разработка ОС

ПРЕДЫДУЩИЙ ВЫПУСК      СЛЕДУЮЩИЙ ВЫПУСК

Intro

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

[предыдущие выпуски рассылки вы всегда можете найти по адресу www.subscribe.ru/archive/comp.soft.prog.osdev/]

Выпуск 2

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

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

После начала работы, процессор может выполнить операцию самотестирования, которая называется BIST - built-in self test. А может ее и не выполнять (зависит от того, "попросит" ли этого чипсет). После этого процессор выполняет свою первую инструкцию, которая находится по физическому адресу 0xFFFFFFF0. Да-да, в самой вершине адресного пространства! Именно там находится (точнее должна находится) EPROM (Erasable Programmable Read-Only Memory) [что это такое...], в которой записана программа дальнейшей инициализации аппаратного обеспечения компьютера. Программное обеспечение, которое получает управление сразу после загрузки компьютера, называется BIOS (Basic Input/Output System), т.е. Базовая Система Ввода/Вывода.

Задача BIOS - распознать аппаратную начинку компьютера, провести над ней серию тестов и (наконец-то!) отыскать и загрузить операционную систему.

В зависимости от установок BIOS, конкретный порядок устройств, на которых ищется загрузчик ОС, может меняться, но, в общем случае, этими устройствами могут быть: Floppy-дисковод, жесткие диски, привод CD-ROM/R/RW, сервер сети, и даже некоторые экзотические накопители, вроде жестких дисков, подключаемых к шине USB.

Наиболее простой способ загрузки ОС, с точки зрения ее разработчика (то есть нас с вами), - это загрузка с дискеты. Если BIOS находит дискету в дисководе, она считывает ее первый сектор (а это первые 512 байт) в оперативную память по адресу 0x0 : 0x7C00. Более подробно о том, как на самом деле хранятся данные на магнитных дисках (к которым относятся и дискеты), мы поговорим в следующий раз, а сейчас наша задача такова:

  1. Написать программу объемом 512 байт, которая выполнит вывод текста на экран
  2. Записать эту программу на дискету
  3. Вставить дискету в дисковод, нажать "reset" и наслаждаться результатом :)

Вот какая программа у меня получилась:

[ORG 0x7C00]

start:

cli
mov ax, cs
mov ds, ax
mov ss, ax
mov sp, start

sti

mov si, msg
call kputs

cli
hlt
jmp short $

kputs:

.loop:
lodsb
test al, al
jz .quit
mov ah, 0x0E
int 0x10
jmp short .loop
.quit:
ret


msg: db "Hello from the world of real programming!",0x0A,0x0D,0
times 510-($-$$) db 0
db 0xAA, 0x55

Скомпилировать эту программу можно используя опцию -f bin NASM'а, которая приказывает ему создать чистный бинарный файл, без заголовков и прочих излишеств. То есть запускать NASM нужно так (учитывая что файл имеет название start.asm):
nasm -fbin start.asm -o start.bin
Получившийся файл start.bin должен иметь размер ровно 512 байт. Эти 512 байт как раз и будут тем загрузчиком, размещенным в начальном секторе дискеты, который будет найден и загружен BIOS.

Если вы используете для тестирования VMWare Workstation, то этот файл можно прямо прописывать как файл-образ дискеты (если VMWare Workstation обнаруживает образ дискеты объемом менее настоящей дискеты, то обращения к несуществующим данным будут невозможны, но существующая часть дискеты будет отлично работать)

Чтобы записать этот загрузчик на настоящую дискету (в целях проверки загрузчика в "боевых" условиях) нужно проделать следующее:
Если вы разрабатываете в UNIX, то используйте команду:
cp start.bin /dev/fd0 (где /dev/fd0 - ваш флопик)
Если же вы используете Windows, то для записи можно использовать программу rawwrite,которая находится на http://uranus.it.swin.edu.au/~jn/linux/rawwrite.htm

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

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

Откуда есть пошли операционные системы, и что это вообще такое?

Давайте посмотрим с высоты нашего третьего тысячелетия на вычислительные машины пятидесятых годов прошлого века. Громоздкие, занимавшие целые здания, они управлялись множеством кнопочек, рычажков и переключателей, с помощью которых оператор мог загрузить программу с перфокарт (или с каких-нибудь других носителей) и управлять действиями компьютера. Оператор ЭВМ представлял собой как бы "живую" операционную систему; он заботился о следующем:

  1. Управление ресурсами компьютера (к примеру отработавшую программу необходимо было выгрузить из памяти и т.п.)
  2. Представлял собой "упрощенный интерфейс" при взаимодействии с компьютером с точки зрения пользователей. Пользователь мог просто сказать оператору: "загрузи-ка мне вот эту перфокарту", даже не постигая тонкости управления машиной.

В сущности, все современные операционные системы выполняют такие же функции, как и наш воображаемый оператор ЭВМ 50-х годов прошлого века. Они точно так же распределяют ресурсы компьютера и предоставляют пользователю (а еще явственнее - программисту) развитые средства взаимодействия с компьютером (например в Windows окно с сообщением можно создать при помощи системной функции MessageBoxA или MessageBoxU, хотя на самом деле процессор (да и все другое аппаратное обеспечение) даже не имеют представления о том, что такое окно. Максимум, что они могут - это выводить разноцветные точки в нужных местах экрана. Но ведь прикладному программисту даже не нужно знать, что происходит под капотом системы!)

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

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

Outro

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

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


Для любопытных

EPROM - в принципе являясь ROM (т.е. памятью только для чтения), имеет возможность перезаписи. Данные в ней хранятся в виде электрических зарядов, находящихся в специальных "изолированных" или "плавающих" транзисторных шлюзах. Этот метод хранения достаточно надежен, чтобы удерживать данные в течении как минимум десяти лет. Перепрограммирование такой памяти возможно при помощи использования т.н. туннельного эффекта, при котором новые данные "вставляются" в транзисторные шлюзы. Стереть же память можно облучив ее чип ультрафиолетовым светом. После этой операции шлюзы разряжаются и их можно перепрограммировать. [Free Online Dictionary of Computing]



ПРЕДЫДУЩИЙ ВЫПУСК      СЛЕДУЮЩИЙ ВЫПУСК

Rambler's Top100