[ Content | View menu ]

Boot: от Мюнхгаузена до PDP/11

Опубликовано 14.10.2014

MunchhausenВ FreeBSD Handbook в разделе про загрузку системы рассматривается известная проблема, когда только что включенный компьютер еще не в состоянии выполнять какие-либо программы, но загрузить ОС ему все же нужно. Авторы руководства проводят параллели с классической историей про барона Мюнхгаузена, когда он вытягивает себя из болота за «bootstraps», и вспоминают известную идиому «to pull oneself up by one’s bootstraps».

Эту фразу часто ошибочно переводят как «вытащить себя за шнурки ботинок», но на самом деле bootstrap (от «boot strap», букв. «обувная петля») — это такая деталь в виде ушка или петельки у обуви (преимущественно у высоких ботинок), расположенная над пяткой; за ушко можно потянуть и тем самым облегчить процесс надевания ботинка. Устоявшегося русского термина, видимо, не существует. А сама идиома означает что-то вроде «разрешить сложную ситуацию собственными усилиями». Одно из первых известных ее появлений в печатном виде зафиксировано в 1834 году в американской газете «Workingman’s advocate» в сообщении об очередном изобретателе вечного двигателя, дескать, мистер Мерфи теперь может сам себя перенести за bootstraps через речку Кумберланд или ограду забора.

Исследователи этимологии утверждают, что никакого отношения к оригинальному Мюнхгаузену это выражение не имеет, хотя бы потому, что во всех сборниках историй про барона вплоть до XX века герой вытаскивал себя из болота за волосы (точнее, за косичку парика); распространенное в англоязычном мире соотнесение Мюнхгаузена и bootstraps, возможно, происходит из английского или американского пересказа истории, в котором переводчик использовал уже устоявшуюся идиому. Нельзя также исключать и возможность всеобщего литературного помешательства, подобно, например, фразе «Мавр сделал своё дело, мавр может уйти», ошибочно приписываемой Шекспиру или стихотворения «Зима! крестьянин, торжествуя…», приписываемого Некрасову.

С момента выхода романа «Улисс» Джеймса Джойса в 1922 году слово «bootstrap» начало широко применяться в разговорной и письменной англо-американской речи, а бутстрапперы — люди, которые сами себя сделали — и вовсе стали частью американской национальной идеи. Впоследствии термин bootstrap неплохо прижился в статистике, бизнесе и некоторых компьютерных концепциях, например, теории компиляторов (применительно к проблеме «чем скомпилировать первый компилятор?»). И тут уже сложно отследить, кто у кого заимствовал столь емкий термин. Поэтому, возвращаясь к computer science, совершенно неудивительно, что для обозначения процесса загрузки, когда компьютер загружает мелкие куски кода, «вытягивающие» в память ЭВМ еще бОльшие программы, было применено именно это словосочетание.

Первое печатное упоминание «bootstrap» применительно к процессу загрузки компьютера встречается в руководстве по архитектуре одного из первых промышленных компьютеров под названием IBM 701 Defense Calculator, выпущенному в октябре 1953 года (сам компьютер был построен в 1952 году, всего их было сделано 12 штук). Процесс загрузки описан там следующим образом (комментарии в скобках курсивом — мои):

Еще один пример того, как программы успешно заменили железо — это загрузка (в оригинале — loading) новой программы в компьютер. На машине есть кнопка загрузки и переключатель источника данных, но они просто запускают процесс. Остальное реализовано с помощью техники, которую иногда называют «bootstrap technique» (вот оно, первое упоминание!). Положение переключателя определяет, откуда программа будет загружена — с магнитной ленты, перфокарт или барабана. Нажатие кнопки «Load» приводит к загрузке одного полного слова (одно слово — 36 бит, термин «байт» будет изобретен автором этого руководства Вернером Бухгольцем чуть позже, в 1956 году при работе над суперкомпьютером IBM 7030 Stretch) в адрес памяти, предварительно выставленный оператором на панели, после чего управление переходит к заданному адресу и компьютер автоматически стартует. Фактически, кнопка Load выполняет программу:

+ Read x
+ Set Drum 0000 (только для барабанов)
- Copy y
+ Tr   y

где x — идентификатор устройства ввода, выставленный на соответствующем селекторе, а y — адрес ячейки памяти (чётный, это важно), введенный оператором. (инструкция Tr, от «Transfer» — взять адрес следующей инструкции из половины слова по адресу, указанному в операнде). Как видите, тут просто читается слово в память и ничего больше. Однако это слово может состоять из двух инструкций, одно из которых — инструкция Copy, в свою очередь копирующая очередную пару инструкций в соответствующий адрес (при чтении в память Copy также проверяет признак конца записи, если достигнут конец, то следующая инструкция пропускается). Новые пары также копируют дальнейшие инструкции до тех пор, пока это необходимо. Каждая новая инструкция Copy, размещенная в памяти, добавляет еще одну инструкцию, так что можно построить программный цикл, который способен загрузить нужную программу в память (понятия «операционная система» тогда, конечно, не существовало)

Очевидно, для описания данного процесса более точного термина, чем bootstrap, придумать сложно :) C незначительными изменениями этот термин дожил до середины 1960х. В частности, в описании процесса загрузки Multics на компьютере GE 645 задействованы кнопка «BOOT» на панели оператора и программы bootstrap1 и bootstrap2. Процесс запуска системы напоминал документ десятилетней давности: оператор настраивает устройство загрузки (устройство считывания перфокарт или магнитных лент), подключает загрузочную кассету Multics и нажимает кнопку BOOT. С кассеты загружается в память и выполняется программа bootstrap1, которая выделяет дополнительные сегменты памяти по фиксированным адресам, настраивает векторы прерываний, загружает с этой же кассеты bootstrap2 и передаёт ей управление. Bootstrap2, в свою очередь, загружает еще несколько программ и в итоге все заканчивается запуском init_proc в кольце защиты ring1 (тогда как в ring0 выполняется сама операционная система). С подробностями этого захватывающего процесса можно познакомиться на странице Multics Bootstrap Loading.

Еще несколько лет после Multics компьютеры загружались в таком же полуручном режиме, когда оператор должен на пульте выставить адрес программы, считывающей загрузчик из медленной внешней памяти в определенный адрес RAM, и затем нажать спец.кнопку, после чего программа будет считана в память и выполнена. В частности, страница документации Boot procedures» (страница 5 PDF-файла по ссылке) первой версии Unix описывает такую последовательность действий для «холодной» загрузки ОС на легендарном PDP-11/20: (обратите внимание, как bootstrap уже сократилось до boot и склоняется в различных вариациях):

- подключить ленту UNIX Init DECtape, перемотанную в конец, в привод 0;
- выставить на переключателях адрес 173740, нажать «load address»;
- выставить на переключателях «1″, нажать кнопку «start»

В адрес памяти 0 с ленты будет прочитана программа vcboot, которая загрузит с той же ленты в адрес памяти 0 программу vcboot и передаст ей управление; vcboot прочитает, скопирует в память еще 16к слов с ленты, этим будет проинициализирована read-only часть памяти. Затем будет считана и выполнена программа bos (Bootstrap Operating System), которая, в свою очередь, выполнит процедуру «Cold UNIX». Cold UNIX дождется подтверждения от оператора (нажатия кнопки «continue» на пульте), после чего инициализирует RF-диск (не совсем понял, что это такое). Далее запускается из 33 блока запускается процедура, которая прочитает инициализационные файлы с ленты и только затем запустит init.

И лишь с распространением мини- и микрокомпьютеров и появлением нормальной постоянной энергонезависимой памяти в середине 1970-х годов программы загрузки начали помещать в ROM. Уже в документации Unix v6, датируемой 11 февраля 1975 года и работающей на PDP-11/45 с программируемыми чипами ROM, описывается загрузка с использованием загрузчика в ПЗУ:
- программа tp помещает в неиспользуемый нулевой блок ленты программу tboot или mboot (в зависимости от типа ленты — DECtape или magtape)
- при загрузке ROM считывает программу загрузки с ленты, помещает ее в адрес памяти 0 и передаёт ей управление; в конечном итоге запускается init.
- если ROM отсутствует, оператору предлагается самостоятельно внести программу чтения программы с 0 адреса ленты в память путем выставления переключателей на пульте. Тем не менее, это уже большой шаг вперед по сравнению с первыми версиями Unix.

А микрокомпьютер Apple I, выпущенный в 1976 году, вообще содержал чип PROM, полностью искоренявший необходимость в контроле пользователя над процессом загрузки. Правда, настройки оборудования были жестко вшиты в загрузчик, так что заменить поставляемую с компьютером операционную систему на другую не представлялось возможным. Да и железо нельзя было просто так поменять.

Но это, пожалуй, совсем другая история, а американская обувная поговорка начала 19 века так и прижилась в computer science.

«

0 комментариев

Write a comment - TrackBack - RSS Comments

Write comment

Я не робот.