В вычислительной технике загрузка — это процесс запуска компьютера , инициируемый аппаратным обеспечением , например кнопкой на компьютере, или программной командой. После включения центральный процессор компьютера (ЦП) не имеет программного обеспечения в своей основной памяти , поэтому некоторый процесс должен загрузить программное обеспечение в память, прежде чем оно сможет быть выполнено. Это может быть сделано аппаратным обеспечением или встроенным ПО в ЦП или отдельным процессором в компьютерной системе.
Перезагрузка компьютера также называется перезагрузкой , которая может быть «жесткой», например, после переключения питания ЦП с выключенного на включенное, или «мягкой», когда питание не отключается. В некоторых системах мягкая загрузка может опционально очистить ОЗУ до нуля . Как жесткая, так и мягкая загрузка могут быть инициированы аппаратным обеспечением, например нажатием кнопки или программной командой. Загрузка завершается, когда достигается оперативная среда выполнения системы , обычно операционная система и некоторые приложения, [nb 1] .
Процесс возврата компьютера из состояния сна (приостановки) не включает загрузку; однако восстановление из состояния гибернации включает. Как минимум, некоторые встроенные системы не требуют заметной последовательности загрузки для начала работы и при включении могут просто запускать операционные программы, которые хранятся в ПЗУ. Все вычислительные системы являются конечными автоматами , и перезагрузка может быть единственным методом возврата в назначенное нулевое состояние из непреднамеренного заблокированного состояния.
Помимо загрузки операционной системы или автономной утилиты, процесс загрузки может также загрузить программу дампа хранилища для диагностики проблем в операционной системе.
Boot — это сокращение от bootstrap [1] [2] или bootstrap load и происходит от фразы to pull oneself up by one's bootstraps ( подтянуть себя за шнурки) . [3] [4] Использование привлекает внимание к требованию, что если большая часть программного обеспечения загружается на компьютер другим программным обеспечением, уже запущенным на компьютере, должен существовать некий механизм для загрузки исходного программного обеспечения на компьютер. [5] Ранние компьютеры использовали различные специальные методы для загрузки небольшой программы в память, чтобы решить эту проблему. Изобретение постоянной памяти (ПЗУ) различных типов решило этот парадокс, позволив компьютерам поставляться с программой запуска, которую нельзя было стереть. Рост емкости ПЗУ позволил реализовать еще более сложные процедуры запуска.
Существует множество различных методов загрузки короткой начальной программы в компьютер. Эти методы простираются от простого физического ввода до съемных носителей, которые могут содержать более сложные программы.
Ранние компьютеры 1940-х и 1950-х годов были уникальными инженерными разработками, на программирование которых могли уходить недели, а загрузка программ была одной из многих проблем, которые нужно было решить. Ранний компьютер ENIAC не имел программы, хранящейся в памяти, но был настроен для каждой задачи с помощью конфигурации соединительных кабелей. Самозагрузка не применялась к ENIAC, чья аппаратная конфигурация была готова к решению задач сразу после подачи питания.
Система EDSAC , второй компьютер с хранимой программой, который был построен, использовала шаговые переключатели для передачи фиксированной программы в память при нажатии кнопки запуска. Программа, хранящаяся на этом устройстве, которое Дэвид Уилер завершил в конце 1948 года, загружала дальнейшие инструкции с перфоленты , а затем выполняла их. [6] [7]
Первые программируемые компьютеры для коммерческой продажи, такие как UNIVAC I и IBM 701 [8], включали функции, упрощающие их работу. Обычно они включали инструкции, которые выполняли полную операцию ввода или вывода. Та же аппаратная логика могла использоваться для загрузки содержимого перфокарты ( наиболее типичных) или других носителей ввода, таких как магнитный барабан или магнитная лента , которые содержали программу самозагрузки, нажатием одной кнопки. Эта концепция загрузки называлась по-разному для компьютеров IBM 1950-х и начала 1960-х годов, но IBM использовала термин «начальная загрузка программы» с IBM 7030 Stretch [9] и позже использовала его для своих линий мэйнфреймов, начиная с System/360 в 1964 году.
Компьютер IBM 701 (1952–1956) имел кнопку «Загрузить», которая инициировала чтение первого 36-битного слова в основную память с перфокарты в устройстве чтения карт , магнитной ленты в ленточном накопителе или магнитного барабана, в зависимости от положения переключателя выбора загрузки. Затем левое 18-битное полуслово выполнялось как инструкция, которая обычно считывала дополнительные слова в память. [10] [11] Затем выполнялась загруженная загрузочная программа, которая, в свою очередь, загружала большую программу с этого носителя в память без дальнейшей помощи со стороны оператора-человека. IBM 704 , [12] IBM 7090 , [13] и IBM 7094 [14] имели схожие механизмы, но с разными кнопками загрузки для разных устройств. Термин «загрузка» использовался в этом смысле по крайней мере с 1958 года. [15]
Другие компьютеры IBM той эпохи имели схожие функции. Например, система IBM 1401 (ок. 1958 г.) использовала устройство чтения карт для загрузки программы с перфокарты. 80 символов, хранящихся на перфокарте, считывались в ячейки памяти с 001 по 080, затем компьютер переходил к ячейке памяти 001, чтобы прочитать свою первую сохраненную инструкцию. Эта инструкция всегда была одинаковой: переместить информацию из этих первых 80 ячеек памяти в область сборки, где информация с перфокарт 2, 3, 4 и так далее могла быть объединена для формирования сохраненной программы. Как только эта информация была перемещена в область сборки, машина переходила к инструкции в ячейке 080 (считывание карты), и следующая карта считывалась, а ее информация обрабатывалась.
Другим примером была IBM 650 (1953), десятичная машина, которая имела группу из десяти 10-позиционных переключателей на своей панели оператора, которые адресулись как слово памяти (адрес 8000) и могли быть выполнены как инструкция. Таким образом, установка переключателей на 7004000400 и нажатие соответствующей кнопки считывало первую карту в считывателе карт в память (код операции 70), начиная с адреса 400, а затем переходило на 400, чтобы начать выполнение программы на этой карте. [16] IBM 7040 и 7044 имеют похожий механизм, в котором кнопка Load вызывает выполнение инструкции, установленной в клавишах ввода на передней панели, и каналу, который устанавливает инструкция, дается команда на передачу данных в память, начиная с адреса 00100; когда эта передача завершается, ЦП переходит на адрес 00101. [17]
Конкуренты IBM также предлагали загрузку программ одним нажатием кнопки.
Примечательная вариация этого обнаружена на Burroughs B1700 , где нет ни самозагружаемого ПЗУ, ни жестко зашитой операции IPL. Вместо этого после сброса системы она считывает и выполняет микроинструкции последовательно с кассетного ленточного накопителя, установленного на передней панели; это устанавливает загрузчик в ОЗУ, который затем выполняется. [21] Однако, поскольку это делает мало предположений о системе, его можно с равным успехом использовать для загрузки диагностических (процедура технического обслуживания) лент, которые отображают понятный код на передней панели даже в случаях серьезного отказа ЦП. [21]
В IBM System/360 и ее последователях, включая современные машины z/Architecture , процесс загрузки известен как начальная загрузка программы (IPL).
IBM придумала этот термин для 7030 (Stretch) , [9] возродила его для дизайна System/360 и продолжает использовать его в этих средах сегодня. [22] В процессорах System/360 IPL инициируется оператором компьютера путем выбора трех шестнадцатеричных цифр адреса устройства (CUU; C=адрес канала ввода-вывода, UU=Устройство управления и адрес устройства [nb 2] ) с последующим нажатием кнопки ЗАГРУЗИТЬ . В моделях System/360 высокого класса , большинстве [nb 3] System/370 и некоторых более поздних системах функции переключателей и кнопки ЗАГРУЗИТЬ имитируются с использованием выбираемых областей на экране графической консоли, часто [nb 4] устройства типа IBM 2250 или устройства типа IBM 3270 . Например, на System/370 Model 158 последовательность клавиш 0-7-X (ноль, семь и X в этом порядке) приводит к IPL с адреса устройства, который был введен в область ввода. Amdahl 470V/6 и связанные с ним ЦП поддерживали четыре шестнадцатеричные цифры на тех ЦП, которые имели установленный дополнительный блок второго канала, что в общей сложности давало 32 канала. Позже IBM также поддерживала более 16 каналов.
Функция IPL в System/360 и ее последователях до IBM Z и ее совместимых устройствах, таких как Amdahl, считывает 24 байта из указанного оператором устройства в основную память, начиная с реального адреса ноль. Вторая и третья группы из восьми байтов обрабатываются как командные слова канала (CCW) для продолжения загрузки программы запуска (первая CCW всегда имитируется ЦП и состоит из команды Read IPL, 02h , с принудительной цепочкой команд и подавлением указания неправильной длины). Когда команды канала ввода-вывода завершены, первая группа из восьми байтов затем загружается в слово состояния программы (PSW) процессора, и программа запуска начинает выполняться в месте, указанном этим PSW. [22] Устройство IPL обычно является дисководом, отсюда особое значение команды типа чтения 02h , но точно такая же процедура используется также для IPL с других устройств типа ввода, таких как ленточные накопители или даже устройства чтения карт, в независимой от устройства манере, что позволяет, например, установить операционную систему на совершенно новый компьютер с магнитной ленты начального распределения ОС. Для контроллеров дисков команда 02h также заставляет выбранное устройство искать цилиндр 0000h , головку 0000h , имитируя команду Seek cylinder and head, 07h , и искать запись 01h , имитируя команду Search ID Equal, 31h ; поиски и поиски не имитируются контроллерами ленты и карты, так как для этих классов устройств команда Read IPL является просто последовательной командой чтения.
Диск, лента или картоприемник должны содержать специальную программу для загрузки самой операционной системы или отдельной утилиты в основное хранилище, и для этой конкретной цели «Текст IPL» помещается на диск отдельной программой DASDI (Direct Access Storage Device Initialization) или эквивалентной программой, работающей под управлением операционной системы, например, ICKDSF, но ленты и картоприемники с поддержкой IPL обычно распространяются с уже имеющимся «Текстом IPL».
IBM внесла некоторые эволюционные изменения в процесс IPL, изменив некоторые детали для System/370 Extended Architecture (S/370-XA) и более поздних версий, а также добавив новый тип IPL для z/Architecture.
Миникомпьютеры , начиная с Digital Equipment Corporation (DEC) PDP-5 и PDP-8 (1965), упростили конструкцию, используя ЦП для поддержки операций ввода и вывода. Это экономило стоимость, но делало загрузку более сложной, чем нажатие одной кнопки. Миникомпьютеры обычно имели какой-то способ переключения в коротких программах, манипулируя массивом переключателей на передней панели . Поскольку ранние миникомпьютеры использовали память на магнитных сердечниках , которая не теряла свою информацию при отключении питания, эти загрузчики оставались на месте, пока их не стирали. Стирание иногда происходило случайно, когда ошибка программы вызывала цикл, который перезаписывал всю память.
Другие мини-компьютеры с такой простой формой загрузки включают серию HP 2100 компании Hewlett-Packard (середина 1960-х годов), оригинальный Data General Nova (1969 год), а также PDP-4 (1962 год) и PDP-11 (1970 год) компании DEC .
Поскольку операции ввода-вывода, необходимые для выполнения операции чтения на устройстве ввода-вывода мини-компьютера, обычно различались для разных контроллеров устройств, для разных устройств требовались разные программы начальной загрузки.
Позже, в 1971 году, DEC добавила дополнительную диодную матрицу памяти только для чтения для PDP-11, которая хранила программу начальной загрузки до 32 слов (64 байта). Она состояла из печатной платы M792, которая подключалась к Unibus и содержала массив полупроводниковых диодов 32 на 16. При наличии всех 512 диодов память содержала все биты «единицы»; карта программировалась путем отключения каждого диода, бит которого должен был быть «нулем». DEC также продавала версии платы, серии BM792-Yx, предварительно запрограммированные для многих стандартных устройств ввода путем простого исключения ненужных диодов. [23] [24]
Следуя более старому подходу, более ранний PDP-1 имел аппаратный загрузчик, так что оператору нужно было только нажать переключатель «загрузить», чтобы дать команду считывателю бумажной ленты загрузить программу непосредственно в основную память. Преемники PDP-4 PDP-7 , [25] PDP-9 , [26] и PDP-15 [27] имели дополнительную кнопку Read-In для считывания программы с бумажной ленты и перехода к ней. Data General Supernova использовала переключатели на передней панели, чтобы заставить компьютер автоматически загружать инструкции в память с устройства, указанного переключателями данных на передней панели, а затем переходить к загруженному коду. [28]
В мини-компьютере с устройством чтения бумажной ленты первая программа, запускаемая в процессе загрузки, загрузчик, считывает в основную память либо загрузчик второго этапа (часто называемый двоичным загрузчиком ), который может считывать бумажную ленту с контрольной суммой , либо операционную систему с внешнего носителя. Псевдокод для загрузчика может быть таким же простым, как следующие восемь инструкций:
Связанный пример основан на загрузчике для мини-компьютера Nicolet Instrument Corporation 1970-х годов, использующем блок считывания-перфорации бумажной ленты на телетайпе Teletype Model 33 ASR . Байты его загрузчика второй ступени считываются с бумажной ленты в обратном порядке.
Длина загрузчика второй стадии такова, что последний байт перезаписывает ячейку 7. После выполнения инструкции в ячейке 6 ячейка 7 запускает выполнение загрузчика второй стадии. Затем загрузчик второй стадии ждет, пока гораздо более длинная лента с операционной системой будет помещена в считыватель ленты. Разница между загрузчиком и загрузчиком второй стадии заключается в добавлении проверочного кода для обнаружения ошибок чтения бумажной ленты, что часто встречается в относительно недорогом оборудовании «частичной занятости», таком как Teletype Model 33 ASR. (Friden Flexowriters были гораздо более надежными, но и сравнительно дорогими.)
Самые ранние микрокомпьютеры, такие как Altair 8800 (выпущенный впервые в 1975 году) и даже более ранняя, похожая машина (на основе процессора Intel 8008) не имели оборудования для самозагрузки как такового. [29] При включении питания процессор видел память, которая содержала бы случайные данные. Передние панели этих машин имели тумблеры для ввода адресов и данных, один переключатель на бит слова памяти компьютера и адресной шины. Простые дополнения к оборудованию позволяли загружать одну ячейку памяти за раз с этих переключателей для хранения кода самозагрузки. Между тем, процессор не пытался выполнить содержимое памяти. После правильной загрузки процессор мог выполнить код самозагрузки. Этот процесс, аналогичный тому, который использовался для нескольких более ранних миникомпьютеров, был утомительным и не должен был содержать ошибок. [30]
Введение интегральной схемы постоянной памяти (ПЗУ) с ее многочисленными вариантами, включая ПЗУ с программированием по маске , программируемые ПЗУ (ППЗУ), стираемые программируемые ПЗУ (СППЗУ) и флэш-память , уменьшило физический размер и стоимость ПЗУ. Это позволило включить программы загрузки прошивки в состав компьютера.
Data General Nova 1200 (1970) и Nova 800 (1971) имели переключатель загрузки программ, который в сочетании с опциями, обеспечивающими наличие двух микросхем ПЗУ, загружал программу в основную память из этих микросхем ПЗУ и переходил к ней. [28] Digital Equipment Corporation представила ПЗУ на основе интегральных схем BM873 (1974), [31] M9301 (1977), [32] M9312 (1978), [33] REV11-A и REV11-C, [34] MRV11-C, [35] и MRV11-D [36] , все они могли использоваться как самозагружаемые ПЗУ. Модели PDP-11/34 (1976), [37] PDP-11/60 (1977), [38] PDP-11/24 (1979), [39] и большинство более поздних включают в себя модули загрузочного ПЗУ.
Итальянский телефонный коммутационный компьютер, названный «Gruppi Speciali», запатентованный в 1975 году Альберто Чиарамеллой , исследователем из CSELT , [40] включал (внешнее) ПЗУ. Gruppi Speciali была, начиная с 1975 года, полностью однокнопочной машиной, загружающейся в операционную систему из памяти ПЗУ, состоящей из полупроводников, а не из ферритовых сердечников. Хотя устройство ПЗУ не было изначально встроено в компьютер Gruppi Speciali, из-за конструкции машины оно также позволяло загружать ПЗУ одной кнопкой в машины, не предназначенные для этого (поэтому это «устройство самозагрузки» было архитектурно-независимым), например PDP-11. Сохранение состояния машины после выключения также имело место, что было еще одной важной особенностью в конкурсе телефонных коммутационных устройств. [41]
Некоторые мини- и супермини-компьютеры включают в себя отдельный консольный процессор, который загружает основной процессор. PDP-11/44 имел Intel 8085 в качестве консольного процессора; [42] VAX -11/780 , первый член линейки 32-разрядных супермини-компьютеров Digital VAX , имел консольный процессор на базе LSI-11 , [43] а VAX-11/730 имел консольный процессор на базе 8085. [44] Эти консольные процессоры могли загружать основной процессор с различных устройств хранения данных.
Некоторые другие суперминикомпьютеры, такие как VAX-11/750, реализуют консольные функции, включая первый этап загрузки, в микрокоде ЦП. [45]
Обычно микропроцессор после сброса или включения питания выполняет процесс запуска, который обычно принимает форму «начать выполнение найденного кода, начиная с определенного адреса» или «поиск многобайтового кода по определенному адресу и переход к указанному месту для начала выполнения». Система, построенная с использованием этого микропроцессора, будет иметь постоянное ПЗУ, занимающее эти специальные места, так что система всегда начинает работать без помощи оператора. Например, процессоры Intel x86 всегда начинаются с выполнения инструкций, начинающихся с F000:FFF0, [46] [47], тогда как для процессора MOS 6502 инициализация начинается со считывания двухбайтового векторного адреса в $FFFD (байт MS) и $FFFC (байт LS) и перехода к этому месту для запуска кода начальной загрузки. [48]
Первый компьютер Apple Computer , Apple 1, представленный в 1976 году, имел чипы PROM, которые устранили необходимость в передней панели для процесса загрузки (как это было в случае с Altair 8800) в коммерческом компьютере. Согласно рекламе Apple, анонсирующей его, «Больше никаких переключателей, больше никаких лампочек... прошивка в PROMS позволяет вам вводить, отображать и отлаживать программы (все в шестнадцатеричном формате) с клавиатуры». [49]
Из-за дороговизны памяти только для чтения в то время Apple II загружал свои дисковые операционные системы, используя ряд очень маленьких инкрементных шагов, каждый из которых передавал управление следующей фазе постепенно усложняющегося процесса загрузки. (См. Apple DOS: Загрузчик ). Поскольку так мало из дисковой операционной системы полагалось на ПЗУ, аппаратное обеспечение также было чрезвычайно гибким и поддерживало широкий спектр настраиваемых механизмов защиты от копирования дисков . (См. Взлом программного обеспечения: История .)
Некоторые операционные системы, особенно системы Macintosh до 1995 года от Apple , настолько тесно переплетены со своим оборудованием, что невозможно изначально загрузить операционную систему, отличную от стандартной. Это противоположная крайность сценария с использованием переключателей, упомянутых выше; он крайне негибкий, но относительно защищен от ошибок и дурака, пока все оборудование работает нормально. Распространенным решением в таких ситуациях является разработка загрузчика, который работает как программа, принадлежащая стандартной ОС, которая захватывает систему и загружает альтернативную ОС. Этот метод использовался Apple для ее реализации A/UX Unix и скопирован различными бесплатными операционными системами и BeOS Personal Edition 5 .
Некоторые машины, такие как микрокомпьютер Atari ST , были «мгновенно включаемыми», с операционной системой, работающей из ПЗУ . Таким образом, извлечение ОС из вторичного или третичного хранилища было исключено как одна из характерных операций для самозагрузки. Чтобы обеспечить автоматическую загрузку системных настроек, аксессуаров и другого вспомогательного программного обеспечения, дисковод Atari считывался для дополнительных компонентов во время процесса загрузки. Существовала задержка тайм-аута, которая давала время вручную вставить дискету, пока система искала дополнительные компоненты. Этого можно было избежать, вставив чистый диск. Аппаратное обеспечение Atari ST также было разработано таким образом, чтобы слот для картриджа мог обеспечивать собственное выполнение программ для игровых целей в качестве пережитка от наследия Atari по созданию электронных игр; вставив картридж Spectre GCR с системным ПЗУ Macintosh в игровой слот и включив Atari, он мог «встроенно загрузить» операционную систему Macintosh, а не собственную TOS Atari .
IBM Personal Computer включал в себя прошивку на основе ПЗУ, называемую BIOS ; одной из функций этой прошивки было выполнение самотестирования при включении питания машины, а затем чтение программного обеспечения с загрузочного устройства и его выполнение. Прошивка, совместимая с BIOS на IBM Personal Computer, используется в IBM PC-совместимых компьютерах. UEFI была разработана Intel, первоначально для машин на базе Itanium , а позже также использовалась как альтернатива BIOS в машинах на базе x86 , включая Apple Mac с процессорами Intel .
Первоначально рабочие станции Unix имели прошивку на основе ПЗУ, специфичную для конкретного поставщика. Позднее Sun Microsystems разработала OpenBoot , позже известную как Open Firmware, которая включала интерпретатор Forth , причем большая часть прошивки была написана на Forth. Она была стандартизирована IEEE как стандарт IEEE 1275-1994; прошивка, реализующая этот стандарт, использовалась в компьютерах Mac на базе PowerPC и некоторых других машинах на базе PowerPC, а также в собственных компьютерах Sun на базе SPARC . Спецификация Advanced RISC Computing определила другой стандарт прошивки, который был реализован на некоторых машинах на базе MIPS и Alpha , а также на рабочих станциях SGI Visual Workstation x86.
Когда компьютер выключен, его программное обеспечение, включая операционные системы, код приложений и данные, остается сохраненным в энергонезависимой памяти . Когда компьютер включен, он обычно не имеет операционной системы или ее загрузчика в оперативной памяти (ОЗУ). Сначала компьютер выполняет относительно небольшую программу, сохраненную в постоянном запоминающем устройстве (ПЗУ, а позже EEPROM , NOR flash ), которое поддерживает выполнение на месте , для инициализации ЦП и материнской платы, для инициализации DRAM (особенно в системах x86), для доступа к энергонезависимому устройству (обычно устройству с блочной адресацией, например, NAND flash, SSD) или устройствам, с которых программы и данные операционной системы могут быть загружены в ОЗУ; кроме того, эта программа может инициализировать устройства отображения (например, графические процессоры ), устройства ввода текста (например, клавиатура ) и устройства ввода указателя (например, мышь ).
Небольшая программа, которая запускает эту последовательность, известна как bootstrap loader , bootstrap или boot loader . Часто используются многоступенчатые boot loaders, в ходе которых несколько программ возрастающей сложности загружаются одна за другой в процессе цепной загрузки .
Некоторые более ранние компьютерные системы, получив сигнал загрузки от человека-оператора или периферийного устройства, могут загрузить очень небольшое количество фиксированных инструкций в память в определенном месте, инициализировать по крайней мере один ЦП, а затем указать ЦП на инструкции и начать их выполнение. Эти инструкции обычно запускают операцию ввода с некоторого периферийного устройства (которое может быть выбрано оператором с помощью переключателя). Другие системы могут отправлять аппаратные команды непосредственно на периферийные устройства или контроллеры ввода-вывода, которые вызывают чрезвычайно простую операцию ввода (такую как «считывание нулевого сектора системного устройства в память, начиная с местоположения 1000»), эффективно загружая небольшое количество инструкций загрузчика в память; затем сигнал завершения от устройства ввода-вывода может использоваться для запуска выполнения инструкций ЦП.
Меньшие компьютеры часто используют менее гибкие, но более автоматические механизмы загрузчика, чтобы гарантировать, что компьютер запустится быстро и с предопределенной конфигурацией программного обеспечения. Например, во многих настольных компьютерах процесс загрузки начинается с того, что ЦП выполняет программное обеспечение, содержащееся в ПЗУ (например, BIOS IBM PC ) по предопределенному адресу (некоторые ЦП, включая серию Intel x86 , разработаны для выполнения этого программного обеспечения после сброса без посторонней помощи). Это программное обеспечение содержит элементарные функции для поиска устройств, имеющих право участвовать в загрузке, и загрузки небольшой программы из специального раздела (чаще всего загрузочного сектора ) наиболее перспективного устройства, обычно начиная с фиксированной точки входа, такой как начало сектора.
Загрузчики могут сталкиваться с особыми ограничениями, особенно по размеру; например, на IBM PC и совместимых устройствах загрузочный код должен помещаться в главную загрузочную запись (MBR) и загрузочную запись раздела (PBR), которые, в свою очередь, ограничены одним сектором; на IBM System/360 размер ограничен носителем IPL, например размером карты , размером дорожки.
В системах с такими ограничениями первая программа, загруженная в ОЗУ, может оказаться недостаточно большой для загрузки операционной системы и вместо этого должна загрузить другую, более крупную программу. Первая программа, загруженная в ОЗУ, называется загрузчиком первой ступени, а программа, которую она загружает, называется загрузчиком второй ступени. Во многих встроенных ЦП встроенное загрузочное ПЗУ ЦП , иногда называемое загрузчиком нулевой ступени, [50] может находить и загружать загрузчики первой ступени.
Примерами загрузчиков первой стадии (этап инициализации оборудования) являются BIOS , UEFI , coreboot , Libreboot и Das U-Boot . На IBM PC загрузчик в Master Boot Record (MBR) и Partition Boot Record (PBR) был закодирован так, чтобы требовать не менее 32 КБ [51] [52] (позже расширен до 64 КБ [ 53] ) системной памяти и использовать только инструкции , поддерживаемые исходными процессорами 8088/8086 .
Загрузчики второго этапа (этап инициализации ОС), такие как shim, [54] GNU GRUB , rEFInd , BOOTMGR , Syslinux , NTLDR и iBoot , сами по себе не являются операционными системами, но способны правильно загружать операционную систему и передавать ей выполнение; впоследствии операционная система инициализируется и может загружать дополнительные драйверы устройств . Загрузчику второго этапа не нужны драйверы для его собственной работы, но вместо этого он может использовать общие методы доступа к хранилищу, предоставляемые системной прошивкой, такой как BIOS, UEFI или Open Firmware , хотя обычно с ограниченной аппаратной функциональностью и более низкой производительностью. [55]
Многие загрузчики (например, GNU GRUB, rEFInd, BOOTMGR Windows, Syslinux и NTLDR Windows NT/2000/XP) можно настроить так, чтобы предоставить пользователю несколько вариантов загрузки. Эти варианты могут включать в себя разные операционные системы (для двойной или мультизагрузки с разных разделов или дисков), разные версии одной и той же операционной системы (на случай, если у новой версии возникнут непредвиденные проблемы), разные параметры загрузки операционной системы (например, загрузка в режиме восстановления или безопасном режиме ) и некоторые автономные программы, которые могут работать без операционной системы, такие как тестеры памяти (например, memtest86+ ), базовая оболочка (как в GNU GRUB) или даже игры (см. Список игр для загрузки ПК ). [56] Некоторые загрузчики также могут загружать другие загрузчики; например, GRUB загружает BOOTMGR вместо прямой загрузки Windows. Обычно выбор по умолчанию выбирается заранее с задержкой, в течение которой пользователь может нажать клавишу, чтобы изменить выбор; после этой задержки автоматически запускается выбор по умолчанию, чтобы можно было выполнить обычную загрузку без вмешательства пользователя.
Процесс загрузки можно считать завершенным, когда компьютер готов к взаимодействию с пользователем или операционная система способна запускать системные программы или прикладные программы.
Многие встроенные системы должны загружаться немедленно. Например, ожидание минуты для запуска цифрового телевидения или навигационного устройства GPS , как правило, неприемлемо. Поэтому такие устройства имеют программные системы в ПЗУ или флэш-памяти , так что устройство может начать функционировать немедленно; загрузка не требуется или требуется в небольшом количестве, поскольку загрузка может быть предварительно вычислена и сохранена в ПЗУ при изготовлении устройства. [ необходима цитата ]
Большие и сложные системы могут иметь процедуры загрузки, которые выполняются в несколько фаз, пока, наконец, операционная система и другие программы не будут загружены и готовы к выполнению. Поскольку операционные системы спроектированы так, как будто они никогда не запускаются и не останавливаются, загрузчик может загрузить операционную систему, настроить себя как простой процесс в этой системе, а затем безвозвратно передать управление операционной системе. Затем загрузчик завершает работу нормально, как и любой другой процесс.
Большинство компьютеров также способны загружаться через компьютерную сеть . В этом сценарии операционная система хранится на диске сервера , и определенные ее части передаются клиенту с помощью простого протокола, такого как Trivial File Transfer Protocol (TFTP). После того, как эти части были переданы, операционная система берет на себя управление процессом загрузки.
Как и в случае с загрузчиком второго этапа, сетевая загрузка начинается с использования общих методов сетевого доступа, предоставляемых загрузочным ПЗУ сетевого интерфейса, которое обычно содержит образ Preboot Execution Environment (PXE). Драйверы не требуются, но функциональность системы ограничена до тех пор, пока ядро операционной системы и драйверы не будут перенесены и запущены. В результате, как только загрузка на основе ПЗУ завершена, вполне возможна сетевая загрузка в операционную систему, которая сама по себе не имеет возможности использовать сетевой интерфейс.
Загрузочное устройство — это устройство хранения, с которого загружается операционная система. Прошивка UEFI или BIOS современного ПК поддерживает загрузку с различных устройств, обычно с локального твердотельного накопителя или жесткого диска через GPT или главную загрузочную запись (MBR) на таком накопителе или диске, с оптического дисковода (с использованием El Torito ), с USB- накопителя ( USB-флеш-накопитель , устройство чтения карт памяти , жесткий диск USB, оптический дисковод USB, твердотельный накопитель USB и т. д.) или с сетевой карты (с использованием PXE ). Более старые, менее распространенные устройства с загрузкой BIOS включают дисководы , Zip-дисководы и приводы LS-120 .
Обычно системная прошивка (UEFI или BIOS) позволяет пользователю настраивать порядок загрузки . Если порядок загрузки установлен как «сначала DVD-привод; затем жесткий диск», то прошивка попытается загрузиться с DVD-привода, а если это не удастся (например, из-за отсутствия DVD-диска в приводе), то она попытается загрузиться с локального жесткого диска.
Например, на ПК с установленной на жестком диске Windows пользователь может установить порядок загрузки, как указано выше, а затем вставить Linux Live CD , чтобы опробовать Linux без необходимости установки операционной системы на жесткий диск. Это пример двойной загрузки , в которой пользователь выбирает, какую операционную систему запустить после того, как компьютер выполнит самотестирование при включении питания (POST). В этом примере двойной загрузки пользователь выбирает, вставляя или извлекая DVD-диск из компьютера, но чаще выбирают, какую операционную систему загрузить, выбирая из меню менеджера загрузки на выбранном устройстве, используя клавиатуру компьютера для выбора из меню загрузки BIOS или UEFI Boot Menu, или и того, и другого; вход в меню загрузки обычно осуществляется нажатием клавиш F8или во время POST; вход в настройки BIOS обычно осуществляется нажатием клавиш или во время POST. [57] [58]F12F2DEL
Доступно несколько устройств, которые позволяют пользователю быстро загрузить то, что обычно является вариантом Linux для различных простых задач, таких как доступ в Интернет; примерами являются Splashtop и Latitude ON . [59] [60] [61]
При запуске процессор x86 IBM-совместимого персонального компьютера в реальном режиме выполняет инструкцию, расположенную в векторе сброса (адрес физической памяти FFFF0h на 16-разрядных процессорах x86 [62] и FFFFFFF0h на 32-разрядных и 64-разрядных процессорах x86 [63] [64] ), обычно указывающую на точку входа прошивки ( UEFI или BIOS ) внутри ПЗУ. Эта ячейка памяти обычно содержит инструкцию перехода, которая переносит выполнение в расположение программы запуска прошивки ( UEFI или BIOS ). Эта программа запускает самотестирование при включении питания (POST) для проверки и инициализации требуемых устройств, таких как основная память ( DRAM ), шина PCI и устройства PCI (включая запуск встроенных дополнительных ПЗУ ). Одним из наиболее сложных шагов является настройка DRAM через SPD , что еще больше усложняется тем фактом, что на этом этапе память очень ограничена.
После инициализации необходимого оборудования прошивка ( UEFI или BIOS ) просматривает предварительно настроенный список энергонезависимых устройств хранения данных («последовательность загрузочных устройств»), пока не найдет то, которое является загрузочным.
Как только BIOS находит загрузочное устройство, он загружает загрузочный сектор по линейному адресу 7C00h (обычно сегмент : смещение 0000h : 7C00h , [51] [53] : 29, но некоторые BIOS ошибочно используют 07C0h : 0000h [ требуется ссылка ] ) и передает выполнение загрузочному коду. В случае жесткого диска это называется главной загрузочной записью (MBR). Обычный код MBR проверяет таблицу разделов MBR на предмет раздела, установленного как загрузочный [nb 5] (тот, у которого установлен флаг active ). Если активный раздел найден, код MBR загружает код загрузочного сектора из этого раздела, известный как загрузочная запись тома (VBR), и выполняет его. Загрузочный код MBR часто зависит от операционной системы.
Загрузочное устройство MBR определяется как устройство, с которого можно производить чтение, и в котором последние два байта первого сектора содержат слово с прямым порядком байтов AA55h , [nb 6], обнаруженное на диске как последовательность байтов 55h , AAh (также известное как загрузочная сигнатура MBR ), или в котором иным образом установлено, что код внутри сектора является исполняемым на ПК x86.
Код загрузочного сектора — это загрузчик первой ступени. Он находится на фиксированных дисках и съемных дисках и должен вписываться в первые 446 байтов основной загрузочной записи , чтобы оставить место для 64-байтовой таблицы разделов по умолчанию с четырьмя записями разделов и двухбайтовой загрузочной подписью , которую BIOS требует для надлежащего загрузчика — или даже меньше, когда в некоторых средах должны поддерживаться дополнительные функции, такие как более четырех записей разделов (до 16 по 16 байтов каждая), подпись диска (6 байтов), временная метка диска (6 байтов), расширенный активный раздел (18 байтов) или специальные многозагрузочные загрузчики. В загрузочных записях томов дискет и супердискет до 59 байт занято для расширенного блока параметров BIOS на томах FAT12 и FAT16 , начиная с DOS 4.0, тогда как EBPB FAT32 , представленный в DOS 7.1, требует даже 87 байт, оставляя только 423 байта для загрузчика при предположении размера сектора 512 байт. Поэтому загрузочные секторы Microsoft традиционно налагали определенные ограничения на процесс загрузки, например, загрузочный файл должен был располагаться в фиксированном положении в корневом каталоге файловой системы и храниться в виде последовательных секторов, [65] [66] условия, учтенные командой и слегка смягченные в более поздних версиях DOS. [66] [nb 7] Затем загрузчик мог загрузить первые три сектора файла в память, которая, как оказалось, содержала другой встроенный загрузчик, способный загрузить оставшуюся часть файла в память. [66] Когда Microsoft добавила поддержку LBA и FAT32, они даже перешли на загрузчик, охватывающий более двух физических секторов и использующий 386 инструкций из соображений размера. В то же время другие поставщики сумели втиснуть гораздо больше функциональности в один загрузочный сектор, не ослабляя изначальные ограничения только на минимально доступную память (32 КБ) и поддержку процессора (8088/8086). [nb 8] Например, загрузочные секторы DR-DOS способны находить загрузочный файл в файловых системах FAT12, FAT16 и FAT32 и загружать его в память целиком через CHS или LBA, даже если файл не хранится в фиксированном месте и в последовательных секторах. [67] [51] [68] [69] [70] [nb 9] [nb 8]SYS
VBR часто зависит от ОС; однако его основная функция — загрузка и выполнение файла загрузчика операционной системы (например, bootmgr
или ntldr
), который является загрузчиком второго этапа, из активного раздела. Затем загрузчик загружает ядро ОС с устройства хранения.
Если активного раздела нет или загрузочный сектор активного раздела недействителен, MBR может загрузить вторичный загрузчик, который выберет раздел (часто через пользовательский ввод) и загрузит его загрузочный сектор, который обычно загружает соответствующее ядро операционной системы. В некоторых случаях MBR может также попытаться загрузить вторичные загрузчики перед попыткой загрузить активный раздел. Если все остальное не удается, он должен выдать вызов прерывания BIOS INT 18h [53] [51] (за которым следует INT 19h на всякий случай, если INT 18h вернется), чтобы вернуть управление BIOS, который затем попытается загрузиться с других устройств, попытаться выполнить удаленную загрузку по сети. [51]
Многие современные системы ( компьютеры Intel Mac и более новые ПК ) используют UEFI . [71] [72]
В отличие от BIOS, UEFI (не устаревшая загрузка через CSM) не полагается на загрузочные секторы, система UEFI загружает загрузчик ( файл приложения EFI на USB-диске или в системном разделе EFI ) напрямую [73] , а ядро ОС загружается загрузчиком.
Многие современные ЦП, SoC и микроконтроллеры (например, TI OMAP ) или иногда даже цифровые сигнальные процессоры (DSP) могут иметь встроенное загрузочное ПЗУ, встроенное непосредственно в их кремний, поэтому такой процессор может выполнять простую последовательность загрузки самостоятельно и загружать загрузочные программы (прошивку или программное обеспечение) из источников загрузки, таких как флэш-память NAND или eMMC. Сложно жестко запрограммировать всю необходимую логику для работы с такими устройствами, поэтому в таких сценариях вместо этого используется встроенное загрузочное ПЗУ. Кроме того, загрузочное ПЗУ может иметь возможность загружать загрузчик или диагностическую программу через последовательные интерфейсы, такие как UART , SPI , USB и т. д. Эта функция часто используется для восстановления системы или может также использоваться для начального программирования энергонезависимой памяти, когда в энергонезависимой памяти еще нет программного обеспечения. Многие современные микроконтроллеры (например, контроллер флэш-памяти на USB-флеш-накопителях ) имеют встроенное ПЗУ, встроенное непосредственно в их кремний.
Некоторые встроенные системы также могут включать промежуточный этап последовательности загрузки. Например, Das U-Boot может быть разделен на два этапа: платформа будет загружать небольшой SPL (Secondary Program Loader), который является урезанной версией U-Boot, а SPL будет выполнять некоторую начальную конфигурацию оборудования (например, инициализацию DRAM с использованием кэша ЦП в качестве ОЗУ) и загружать более крупную, полнофункциональную версию U-Boot. [74] Некоторые ЦП и SoC могут не использовать кэш ЦП в качестве ОЗУ в процессе загрузки, они используют интегрированный загрузочный процессор для выполнения некоторой конфигурации оборудования, чтобы снизить стоимость. [75]
Также возможно взять под контроль систему, используя аппаратный интерфейс отладки, такой как JTAG . Такой интерфейс может использоваться для записи программы загрузчика в загружаемую энергонезависимую память (например, флэш-память), указав ядру процессора выполнить необходимые действия для программирования энергонезависимой памяти. В качестве альтернативы, интерфейс отладки может использоваться для загрузки некоторого диагностического или загрузочного кода в ОЗУ, а затем для запуска ядра процессора и указания ему выполнить загруженный код. Это позволяет, например, восстанавливать встроенные системы, где на любом поддерживаемом загрузочном устройстве не осталось программного обеспечения, и где процессор не имеет встроенного загрузочного ПЗУ. JTAG является стандартным и популярным интерфейсом; многие ЦП, микроконтроллеры и другие устройства производятся с интерфейсами JTAG (по состоянию на 2009 год [обновлять]). [ необходима цитата ]
Некоторые микроконтроллеры предоставляют специальные аппаратные интерфейсы, которые не могут использоваться для произвольного управления системой или прямого запуска кода, но вместо этого они позволяют вставлять загрузочный код в загружаемую энергонезависимую память (например, флэш-память) с помощью простых протоколов. Затем на этапе производства такие интерфейсы используются для внедрения загрузочного кода (и, возможно, другого кода) в энергонезависимую память. После сброса системы микроконтроллер начинает выполнять код, запрограммированный в его энергонезависимую память, точно так же, как обычные процессоры используют ПЗУ для загрузки. Наиболее заметно, что эта техника используется микроконтроллерами Atmel AVR , а также другими. Во многих случаях такие интерфейсы реализуются с помощью аппаратной логики. В других случаях такие интерфейсы могут быть созданы программным обеспечением, работающим в интегрированном на кристалле загрузочном ПЗУ с контактов GPIO .
Большинство DSP имеют последовательный режим загрузки и параллельный режим загрузки, например, интерфейс хост-порта (загрузка HPI).
В случае DSP в конструкции системы часто присутствует второй микропроцессор или микроконтроллер, который отвечает за общее поведение системы, обработку прерываний, работу с внешними событиями, пользовательский интерфейс и т. д., в то время как DSP предназначен только для задач обработки сигналов. В таких системах DSP может быть загружен другим процессором, который иногда называют хост- процессором (давая имя хост-порту). Такой процессор также иногда называют главным , поскольку он обычно сначала загружается из своей собственной памяти, а затем управляет общим поведением системы, включая загрузку DSP, а затем дополнительно управляет поведением DSP. DSP часто не имеет собственной загрузочной памяти и вместо этого полагается на хост-процессор для предоставления необходимого кода. Наиболее заметными системами с такой конструкцией являются сотовые телефоны, модемы, аудио- и видеоплееры и т. д., где DSP и ЦП/микроконтроллер сосуществуют.
Многие микросхемы FPGA загружают свою конфигурацию из внешнего последовательного EEPROM («конфигурационное ПЗУ») при включении питания.
Были реализованы различные меры, повышающие безопасность процесса загрузки. Некоторые из них стали обязательными, другие могут быть отключены или включены конечным пользователем . Традиционно загрузка не предполагала использования криптографии . Безопасность можно обойти, разблокировав загрузчик , что может быть одобрено или не одобрено производителем. Современные загрузчики используют параллелизм, то есть они могут запускать несколько ядер процессора и потоков одновременно, что добавляет дополнительные уровни сложности к безопасной загрузке.
Мэтью Гарретт утверждал, что загрузка безопасности служит законной цели, но при этом выбираются настройки по умолчанию , которые являются враждебными для пользователей. [76]
При отладке параллельной и распределенной системы систем bootloop ( также называемый boot loop или boot-loop ) — это диагностическое условие ошибочного состояния, которое возникает на вычислительных устройствах; когда эти устройства неоднократно не могут завершить процесс загрузки и перезагружаются до завершения последовательности загрузки, перезагрузка может помешать пользователю получить доступ к обычному интерфейсу.
По мере того, как сложность современных продуктов увеличивается, отдельные проекты, отдельные отделы или даже отдельные компании больше не могут разрабатывать полные продукты, что приводит к параллельной и распределенной разработке. Сегодня и во всем мире отрасли сталкиваются со сложной разработкой продуктов и ее огромным набором связанных проблем, касающихся организации проекта, контроля проекта и качества продукта. Многие процессы также станут распределенными. Процесс обнаружения дефектов, столь важный для измерения и, в конечном счете, достижения качества продукта, как правило, является одним из первых, испытывающих проблемы, вызванные распределенной природой проекта. Распределение действий по обнаружению дефектов между несколькими сторонами приводит к таким рискам, как неадекватный обзор рабочих продуктов, возникновение «слепых пятен» в отношении тестового покрытия или избыточное тестирование компонентов. Поэтому необходима координация обнаружения дефектов на протяжении всего жизненного цикла для обеспечения эффективности и результативности действий по обнаружению дефектов. —JJM Trienekens; RJ Kusters. (2004) [78]
Система может проявить свое ошибочное состояние, например, в явном цикле загрузки или синем экране смерти , прежде чем будет указано восстановление. [79] Для обнаружения ошибочного состояния может потребоваться распределенное хранилище событий и платформа потоковой обработки для работы распределенной системы в реальном времени.
Ошибочное состояние может вызвать bootloops; это состояние может быть вызвано неправильной настройкой из ранее известных исправных операций. [a] Попытки восстановления из этого ошибочного состояния затем переходят в перезагрузку, пытаясь вернуться в известное исправное состояние. В операциях ОС Windows, например, процедура восстановления заключалась в трехкратной перезагрузке, перезагрузки требовались для возврата к пригодному для использования меню. [80] [81] [79]
Восстановление может быть указано с помощью Security Assertion Markup Language (SAML), который также может реализовать Single sign-on (SSO) для некоторых приложений; в модели безопасности с нулевым доверием идентификация, авторизация и аутентификация являются раздельными задачами в сеансе SSO. Когда указывается на восстановление сайта (например, на экране терминала аэропорта отображается синий экран смерти ), [a] для исправления ситуации могут потребоваться личные визиты на сайт. [78]
+1FEh
в загрузочных секторах — 55h AAh
, то есть 55h
по смещению +1FEh
и AAh
по смещению +1FFh
. Поскольку в контексте совместимых с IBM PC машин необходимо предполагать представление little-endian , в программах для процессоров x86 это можно записать как 16-битное слово (обратите внимание на поменянный порядок), тогда как в программах для других архитектур ЦП это должно быть записано как представление big-endian . Поскольку это много раз путалось в книгах и даже в оригинальных справочных документах Microsoft, в этой статье используется представление на основе смещения побайтово на диске, чтобы избежать любой возможной неверной интерпретации.AA55h
55AAh
Поскольку регистр CS содержит F000 (тем самым указывая сегмент кода, начинающийся с физического адреса F0000), а указатель инструкций содержит FFF0, процессор выполнит свою первую инструкцию по физическому адресу FFFF0H.
После RESET адресные линии A31–20 автоматически утверждаются для выборки инструкций. Этот факт вместе с начальными значениями CS:IP заставляет выполнение инструкций начинаться с физического адреса FFFFFFF0H.
Первая инструкция, которая извлекается и выполняется после аппаратного сброса, находится по физическому адресу FFFFFFF0h. Этот адрес на 16 байт ниже самого верхнего физического адреса процессора. EPROM, содержащий код инициализации программного обеспечения, должен находиться по этому адресу.
[…]
SYS
был улучшен в
DR DOS 5.0,
поэтому вам не нужно беспокоиться о том, чтобы оставить первый кластер свободным на диске, который вы хотите сделать загрузочным. Системные файлы DR DOS могут располагаться в любом месте на диске, поэтому любой диск с достаточным свободным местом может быть настроен для загрузки вашей системы. […](Примечание. Источник приписывает это утилите SYS, хотя на самом деле это функция расширенного загрузчика в загрузочном секторе. SYS просто помещает этот сектор на диск.)
[…] Загрузочный сектор
DR-DOS
[…] ищет файл
IBMBIO.COM
(
DRBIOS.SYS
), а затем загружает *весь* файл в память, прежде чем передать ему управление. […]
[…] Загрузочный сектор
DR-DOS
загружает весь файл
IBMBIO.COM
в память, прежде чем выполнить его. Ему совершенно безразличен файл
IBMDOS.COM
, который загружается IBMBIO.COM. […] Загрузочный сектор DR-DOS […] найдет […] файлы ядра, если они логически хранятся в корневом каталоге. Их физическое расположение на диске и то, фрагментированы они или нет, не имеет значения для загрузочного сектора DR-DOS. Следовательно, вы можете просто скопировать файлы ядра на диск (даже с помощью простого
COPY
), и как только загрузочный сектор станет сектором DR-DOS, он найдет и загрузит их. Конечно, трудно уместить все это всего в 512 байт, размер одного сектора, но это значительное улучшение удобства, если вам нужно настроить систему DR-DOS, и это также ключ к
работе утилиты DR-DOS multi-OS
LOADER . Файлы ядра
MS-DOS
должны находиться в определенных местах, но файлы DR-DOS могут быть где угодно, поэтому вам не нужно физически менять их местами каждый раз, когда вы загружаете другую ОС. Кроме того, это позволяет обновить систему DR-DOS, просто скопировав файлы ядра поверх старых, нет необходимости в
SYS
, нет сложных процедур настройки, как требуется для MS-DOS/
PC DOS
. Вы даже можете иметь несколько файлов ядра DR-DOS под разными именами, хранящихся на одном диске, и LOADER будет переключаться между ними в соответствии с именами файлов, указанными в файле
BOOT.LST
. […]
[…]
DR-DOS
FDISK
не только разбивает диск, но и может форматировать только что созданные тома и инициализировать их загрузочные секторы за один раз, поэтому нет риска случайно испортить не тот том и нет необходимости в
FORMAT
/S или
SYS
. После этого вы можете просто скопировать оставшиеся файлы DR-DOS, включая системные файлы. Важно знать, что в отличие от
MS-DOS
/
PC DOS
, DR-DOS имеет «умные» загрузочные секторы, которые фактически «монтируют» файловую систему для поиска и загрузки системных файлов в корневом каталоге, а не ожидают, что они будут размещены в определенном месте. Физически системные файлы могут располагаться где угодно, а также могут быть фрагментированы. […]