Во многих системах приличная часть времени загрузки идет на обеспечение унаследованной поддержки для MS-DOS. В различных проектах, включая LinuxBIOS и Open Firmware, проприетарный BIOS пытаются заменить на рационализированные фрагменты кода, способные делать только то, что необходимо, чтобы ядро Linux загрузилось и заработало. Эта статья дает краткий обзор данной темы.
Бииип!
Хоть и может показаться вполне естественным, что PC гудит при включении, на самом деле, есть фрагмент кода, который заставляет его делать это. Этот фрагмент встроен в загрузчик. В большинстве PC он называется BIOS. (Слово является акронимом basic input/output system (базовая система ввода/вывода)). BIOS обеспечивает поддержку основного оборудования, которую ранние операционные системы x86 использовали для доступа к дискам, мониторам и почти ко всему остальному.
Одно из первых действий, которое делает BIOS — проведение различных проверок включения: идентификация (и, возможно, тестирование) доступной памяти, определение тактовой частоты и так далее. Если проверка прошла удачно, компьютер гудит один раз. Этот процесс называют power-on self test (внутренний тест при включении) или POST. Англоязычные компьютерные фанаты обычно используют этот термин в качестве глагола: “That machine won’t even POST, so we should swap the memory.” (Эта машина даже не проходит тест BIOS (POST), так что надо поменять память.)
Типовая диагностика включает в себя звуковые коды (которые меняются от производителя к производителю) или диагностические коды, которые могут быть записаны по особому адресу. Некоторые съемные платы позволяют легко получить доступ ним; стандартно диагностические коды записываются в порт 80. Некоторые производители продают съемные платы, которые показывают в шестнадцатеричном формате последний байт, записанный в порт 80. Если вы проводите серьезную отладку, то захотите иметь что-то вроде этого, а возможно, и какое-то более универсальное средство, например, PC Weasel, записывающий последние несколько (256) кодов POST, которые вы затем с удовольствием прочитаете. Разумеется, точное значение этих кодов меняется от BIOS’а к BIOS’у, и только некоторые производители документируют их. К счастью, разработчики открытых исходных кодов делают это хорошо.
Что BIOS когда-либо сделал для нас?
Такая операционная система как MS-DOS может загружать дополнительные драйверы устройств, например CD-ROM’а, но требует, чтобы все драйверы оборудования были загружены при запуске системы. Стандартный интерфейс, предусмотренный для этих драйверов, поддерживается BIOS’ом и из-за этого BIOS должен исследовать устройства, идентифицировать и, возможно, инициализировать их для использования.
Точно так же BIOS отвечает за инициализацию памяти. Не все операционные системы требуют, чтобы память была инициализирована, но ранние DOS обычно требовали, и даже сегодня большинство BIOS’ов, возможно, делают это ради совместимости. Только один этот процесс может быть очень долгим и многие современные системы частично или полностью отключают его. В то же время, BIOS попытается определить количество доступной памяти. В числе прочих действий, совершаемых при загрузке, может быть инициализация и включение кэша процессора, настройка двойных CPU, построение таблицы информации о процессорах, создание списка устройств PCI, присоединенных к системе, и даже запуск аппаратных загрузчиков, предоставленных этими устройствами, которые могут загружать дополнительные драйверы.
Так что сделать надо много. Так много, что, я допускаю, выполнение POST и последующая инициализация драйверов может потребовать целой минуты или больше. BIOS может выполнять различные опросы оборудования в поисках загрузочных устройств, а в некоторых системах даже попытаться выполнить сетевую загрузку через Ethernet. Я думаю, что одна система тратит около пяти секунд, инициализируя сетевые загрузочные параметры, даже если сетевая загрузка отключена. Досадно!
Последнее по порядку, но не по важности — BIOS делает изрядное количество работы по инициализации. Что-то, но не все, оказывается полезным вне зависимости от того, что вы собираетесь загрузить. Назначение запросов прерывания (IRQ) устройствам — возможно и правда, полезный сервис, так как оно позволяет ОС просто брать список устройств и начинать работу, не программируя их. У многих устройств есть конфигурационные регистры, в которые BIOS может записывать подходящие или правильные значения на основании установок, располагающихся в системной памяти, доступной для записи. (Вообще, эта память называется CMOS, хотя не строго обязательно, что она на самом деле реализована с помощью данной технологии.)
Что происходит после того как BIOS сделает это все? Он где-то (чаще на диске) находит блок кода и выполняет его, как правило, загружая операционную систему. Если операционная система DOS или что-то в этом роде, вся эта работа по установке означает, что вы незамедлительно получите свое приглашение командной строки.
Двойная работа
Но у Linux, или BSD, или Windows есть свои собственные драйверы. Так что дальше операционная система прочитывает список прилагающихся устройств PCI и начинает загружать эти драйверы. Работа, проделанная BIOS’ом, по большей части игнорируется; операционная система, раз уж загружает драйвер SCSI, сама изучит шину SCSI. BIOS только предоставляет информацию, ничего больше, а значительная ее часть не используется. Все, что действительно требовалось от BIOS‘а, — это загрузить первую порцию кода (под названием начальный загрузчик (bootstrap loader) или bootloader) и дать возможность машине работать.
Итак, на довольно сильно нагруженной машине вам приходится ждать, пока каждое устройство будет проверено дважды. Часто аппаратный загрузчик для контроллера SCSI тратит довольно много времени, чтобы просмотреть устройства. Хуже то, что во время работы аппаратного загрузчика больше ничего не происходит. В противоположность этому, современная операционная система может загрузить драйвер SCSI, инициировать сброс шины, затем продолжить загрузку других драйверов и другую работу, перед тем как вернуться к проверке устройств. Словом, сканирование, которое делает ОС, быстрее, чем то, которое проводит BIOS.
Точная разница в скоростях зависит от операционной системы. Однако мы знаем, что в Linux сканирование при загрузке может проходить очень и очень быстро. А это значит, что BIOS не только занимает почти половину времени от включения питания до загрузки последнего драйвера; он, вероятно, тратит значительно больше. Это становится особенно заметным, когда менее существенные модули ядра (такие как звуковые драйверы) могут быть загружены позже, возможно, после загрузки более критичных вещей (таких как Web-сервисы).
Все, что мы хотим, — это получить способ загрузить ядро, не дожидаясь, пока BIOS сделает множество установок, которые ядро и само сделает, причем гораздо быстрее, лучше и, может быть, надежнее.
Поместите ядро во флэш
Есть очевидная проблема, которая появляется, когда мы удаляем все драйверы устройств из BIOS‘а: если BIOS не загружает их, как он сможет прочитать ядро? Простое решение — использовать все место, освобожденное после удаления драйверов, для хранения минимального ядра. Все, что этому ядру потребуется для загрузки, это драйвер для диска, на котором содержатся другие, загружаемые модули. После начала работы ядра они могут быть загружены динамически.
Размер современных микросхем flash-памяти BIOS’а делает эту альтернативу удивительно жизнеспособной. Во многих системах есть один или два мегабайта flash-памяти, доступной для BIOS’а. Иногда BIOS в самом деле такой большой. В других случаях памяти оказывается больше, чем надо, просто потому, что “оптом было дешевле”. В достаточной степени разобранное и сжатое ядро может легко поместиться в таком пространстве, а у Linux’овых загрузчиков есть большой опыт в создании крошечных декомпрессоров для распаковки сжатых ядер.
Такое решение, возможно, не лучшее для людей, делающих активную разработку ядра, но для системы, в которой вы хотите ускорить возможную загрузку, это может быть хорошим выбором. Проект LinuxBIOS работает над этим решением и он, должно быть, больше всего подойдет для тех, кто использует сервера и встроенные системы.
Open Firmware
Основной источник происхождения встроенных загрузчиков, который разработан не под MS-DOS, — это Open Firmware. Изначально использовавшийся компаниями Sun и Apple, этот открытый стандарт для встроенного загрузчика разработан с меньшим вниманием к системам в стиле DOS и большим интересом к таким системам, как первоначальный Mac OS, Mac OS X или Solaris, которые сами работают с драйверами. Серьезное преимущество Open Firmware — это то, что он “однажды появившись, работает везде”: устройства с аппаратным загрузчиком для Open Firmware будут работать хорошо в любой системе Open Firmware с шиной, в которую его можно вставить. Загвоздка в том, что у очень немногих устройств, созданных для x86 PC есть встроенные загрузчики Open Firmware. Тем не менее, если вы можете найти такое устройство, это может стать хорошим выбором; это, разумеется, требует, чтобы вы могли определить свои аппаратные средства и стандартизовать отдельные компоненты.
Open Firmware — наверное наиболее дружественный к крутым программистам виджет. Он не делает упор на быстрой загрузке, как например, LinuxBIOS, но в общем, гораздо быстрее, чем традиционный PC BIOS, и чрезвычайно дружелюбен к пользователям, которые ищут способы для настройки своих машин. Мир станет прекраснее, если производители x86 начнут использовать Open Firmware по умолчанию.
Другие пути создания свободного BIOS’а
Даже BIOS, который просто пытается повторить основные функции более традиционного BIOS’а, зачастую может сделать какие-то вещи более быстрыми и открытыми. Например, можно отрегулировать время, которое тратится на проверку устройств, если вы знаете, что в данной системе нет устройств, на проверку которых требуется от 5 до 10 секунд.
Одна важная вещь, которую свободный BIOS умеет делать, — это быть немного более гибким в разработке загрузчиков. К примеру, проект OpenBIOS использовался в сочетании с LinuxBIOS, из которого был взят низко-уровневый код и ядром OpenBIOS Forth в качестве полезной нагрузки, чтобы улучшить систему до Open Firmware. Большая часть самой тяжелой работы в системах x86 — создание крошечного блока кода, который загружает настоящий загрузчик; более гибкий BIOS мог бы делать эту работу и это решило бы проблему.
Обратите внимание, что хотя LinuxBIOS первоначально предназначался для Linux, он используется для загрузки других систем; например, в конце 2002 под LinuxBIOS успешно был загружен Windows 2000. Более общие достижения в расширении совместимости и поддержки происходят постоянно, но идея ухода от зависимости от проприетарного программного обеспечения для загрузки систем остается одной из самых важных.
Есть несколько довольно специализированных, но не свободных, программ BIOS. К примеру, оборудование Soekris Engineering, которое поставляется с BIOS’ом под названием comBIOS, который гораздо проще и меньше, чем стандартный BIOS, и значительно быстрее загружается.
Много внимания и никакой документации
Когда люди бьются с компьютерными проблемами, один из наиболее общих советов, который они получают, — обновить BIOS. Почему? Теоретически BIOS не используется после загрузки системы. Но на самом деле работа по инициализации, проделанная BIOS’ом, может оказаться решающей. Например, в одной х86-ой системе, которую я использовал, контроллер шины CardBus был непригоден, потому что в нем должно было быть запрограммировано IRQ; в обновленном BIOS’е это было исправлено. Теоретически в операционной системе, возможно, мог бы быть специальный код распознавания конкретно этой модели контроллера шины CardBus и программирования в него IRQ, но производителю платы проще написать код, правильно программирующий контроллер, специально для этой конкретной платы.
Традиционно считается, что в системах с открытыми исходными кодами больше шансов отловить ошибки. Однако в случае с BIOS’ом это не так очевидно. В конце концов, у создателей оборудования может быть дополнительная информация, которой не имеют разработчики BIOS’ов общего назначения. Свободно распространяемый BIOS общего назначения должен уметь выполняться на дюжине плат; с другой стороны, производитель может сделать допущения, не беспокоясь о том, что программа будет делать на другом оборудовании.
Правда, у открытого подхода есть много преимуществ. Например, BIOS на старой системе Alpha, которую я использовал, поддерживает микросхемы SCSI-контроллера Symbios Logic ’875. Однако, у него есть жестко запрограммированный список пар ID производителя/продукта PCI, для которых есть поддержка, и он будет работать только с картами из этого списка; правильно работающая карта, не включенная в список, просто игнорируется. Поскольку BIOS является закрытым кодом, и в самом деле в чем-то туманным, я не мог даже исправить таблицу; я должен был за US $220 купить карту SCSI у определенного производителя вместо того, чтоб использовать физически идентичную, имеющуюся в наличии, за US $75.
Переломный момент, вероятно, наступит, когда производители материнских плат решат использовать BIOS с открытым кодом вместо того, чтобы быть связанным с одним из главных коммерческих предложений. Я не знаю, когда это произойдет и произойдет ли вообще, но было бы неплохо увидеть BIOS с лучшей поддержкой и документацией.
Использование всего этого
Для большинства пользователей все это непрактично. Опасность некорректно запрограммированного чипа BIOS достаточно серьезна: ваш компьютер вообще не будет работать, пока чип не будет перепрограммирован, а поскольку компьютер не может загрузиться, чтобы запрограммировать чип, вам потребуется специальное оборудование. Не все, но некоторые системы имеют две микросхемы flash-памяти и позволяют с одной из них загружаться, а затем программировать вторую. Так что для большинства людей эксперименты с созданием альтернативного BIOS’а будут вероятно несколько рискованными. Тем не менее, если вы обнаружите в запасе старый компьютер, который не побоитесь испортить, и который поддерживается одним из свободно распространяемых BIOS’ов, будет забавно рискнуть. Люди увлеченные нашли бы это заманчивым.
На сегодняшний день от этой технологии скорее выиграют люди, работающие на группах серверов или встроенных системах. Если для вас имеет значение, как долго происходит перезагрузка, то это серьезный стимул вложиться в работу и время, чтобы получить что-то, что будет работать на оборудовании, которое вы используете. К тому же, ни один внедренный проект разработки не порадует так, как если вы сделаете что-то сумасшедшее и неподдерживаемое.
В конце концов эта технология даст производителям большую возможность выбора. У производителей встраиваемых систем есть больше вариантов для выбора встроенного загрузчика, и увеличение их количества поможет нам уйти от скромного набора проприетарных BIOS’ов к более открытому и конкурентному рынку.
Автор: Питер Сибах (Peter Seebach)
Взято с developerWorks
One Comment