Intro
Здравствуйте! Сегодняшний выпуск - практико-теоретический и наряду с самозапускающейся без помощи ОС программой, мы рассмотрим теоретические вопросы загрузки компьютера, а также перенесемся на полсотни лет назад в прошлое и посмотрим на операционные системы тех лет. Ну а обещанный рассказ об эволюции ОС мы оставим на следующий раз, ок?
[предыдущие выпуски рассылки вы всегда можете найти по адресу
Выпуск 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
На сегодня все, надеюсь, что вам было интересно. В следующий раз мы продолжим разговор о темах, затронутых в сегодняшнем выпуске.
Мой почтовый ящик всегда открыт для вас: -
Также вы можете задавать интересующие вас вопросы в форуме lowlevel.ru
Всего наилучшего!
Lonesome
Для любопытных
EPROM - в принципе являясь ROM (т.е. памятью только для чтения), имеет возможность перезаписи. Данные в ней хранятся в виде электрических зарядов, находящихся в специальных "изолированных" или "плавающих" транзисторных шлюзах. Этот метод хранения достаточно надежен, чтобы удерживать данные в течении как минимум десяти лет. Перепрограммирование такой памяти возможно при помощи использования т.н. туннельного эффекта, при котором новые данные "вставляются" в транзисторные шлюзы. Стереть же память можно облучив ее чип ультрафиолетовым светом. После этой операции шлюзы разряжаются и их можно перепрограммировать. [Free Online Dictionary of Computing]