Я программирую с EDK2, я хочу загрузить устаревшую ОС с моим приложением UEFI в режиме UEFI.

Прошивка поддерживает UEFI/Legacy. Legacy os win7 запустится, если я ничего не сделаю. Оболочка efi запустится, если я решу загрузиться с моего блочного устройства usb fat32 с оболочкой efi.

Я прочитал исходный код в UDK2014\IntelFrameworkModulePkg\Library\GenericBdsLib (UDK2014 - это мое рабочее пространство для edk2), функция LegacyBoot в EFI_LEGACY_BIOS_PROTOCOL не сработала, я снова потерпел неудачу, даже если ссылка на GenericBdsLib не знаю, какой подробно я заглотил. попросить помощи!!!

3 ответа3

1

Первый: зачем? Это может звучать как грубый и пренебрежительный комментарий, но это серьезный вопрос. Есть законные причины для загрузки операционной системы BIOS режима на компьютере EFI основы, но ваш вопрос не представляет никакой мотивации для этого. С точки зрения программирования, эта задача - боль; и, как вы говорите, целевой операционной системой является Windows 7, которая поддерживает загрузку в режиме EFI, мне даже отдаленно не ясно, стоит ли это усилий. Кроме того, существует три способа сделать это без написания нового кода ....

Первый способ сделать это - использовать встроенный менеджер загрузки вашего компьютера. В нем должны быть представлены варианты загрузки любой установленной ОС в режиме EFI или в режиме BIOS/CSM/legacy. Однако информация о том, как получить доступ к этому меню, может быть разной на разных компьютерах, а информация о том, что будет отображаться в меню, будет разной. Чаще всего загрузка в режиме BIOS с дисков определяется по производителю диска или номеру модели, а записи в режиме EFI - это имена, связанные с ОС, например Windows boot manager . Результатом использования этого метода будет не совсем то, что вы описываете (а именно, запуск Windows из вашего собственного приложения EFI), но он может соответствовать вашим потребностям.

Второй способ - использовать мой менеджер загрузки rEFInd. Как и встроенный в компьютер менеджер загрузки, rEFInd позволяет запускать загрузчики в режиме BIOS или EFI (при условии, что прошивка поддерживает оба). Одно предостережение заключается в том, что на ПК на основе UEFI эта функция по умолчанию отключена; Вы должны отредактировать refind.conf чтобы раскомментировать строку scanfor и убедиться, что hdbios является одним из вариантов. (Если целевая ОС в режиме BIOS находится на внешнем диске или компакт-диске, для этого есть другие ключевые слова - подробности см. В комментариях в файле refind.conf .) Как и встроенный менеджер загрузки, это решение не будет точно выполнять то, что вы говорите, но оно может быть адекватным. Кроме того, у вас может быть запуск приложения rEFInd, который можно настроить с коротким тайм-аутом для запуска ОС в режиме BIOS по умолчанию. Такой подход будет иметь именно тот эффект, который вы желаете, хотя rEFInd несет значительные накладные расходы, поэтому это будет довольно не элегантное решение.

rEFInd также имеет отношение к вашему вопросу, потому что он содержит код для выполнения того, что вы хотите. Вы должны сосредоточиться на файлах исходного кода refind/legacy.c и EfiLib/legacy.c . Имейте в виду, однако, что rEFInd включает в себя два совершенно разных пути загрузки BIOS/CSM/legacy-mode, один для Mac и один для ПК на основе UEFI. Поскольку вы имеете в виду именно UEFI, скорее всего, вы хотите второе, а не первое. В refind/legacy.c код UEFI находится в основном в функциях, имена которых включают строку UEFI ; другие функции для Mac. EfiLib/legacy.c содержит исключительно код пути UEFI; но большинство этих функций взято из TianoCore EDK2, поэтому вам может не понадобиться дублировать их. (Поскольку rEFInd предназначен для сборки либо с EDK2, либо с GNU-EFI, я закончил тем, что извлек большую часть кода EDK2, чтобы его можно было собрать с помощью GNU-EFI.) OTOH, эти функции могли быть изменены по сравнению с оригинальными EDK2, поэтому вам может потребоваться дополнительная настройка для правильной работы, если вы используете оригиналы EDK2. Обратите внимание, что rEFInd использует GPLv3, поэтому, если вы собираетесь распространять свою программу, использование кода rEFInd потребует использования GPLv3 или совместимой лицензии.

Третий способ сделать это - использовать менеджер загрузки Clover. Это менеджер загрузки Hackintosh, который, как и rEFInd, частично получен из более старого (и теперь заброшенного) менеджера загрузки rEFIt. Как и rEFInd, Clover включает код для запуска ОС в режиме BIOS; однако это происходит не так, как rEFInd. Вы можете использовать Clover так же, как вы используете rEFInd, либо как часть вашего пути загрузки, либо как пример кода для извлечения и включения в вашу собственную программу. Хотя на странице Sourceforge Clover говорится, что она использует лицензию BSD, это не совсем так; некоторые файлы исходного кода указывают, что он использует GPL.

К сожалению, как вы вскоре узнаете, если вы начнете просматривать код rEFInd или Clover, задача запуска загрузчика в режиме BIOS из EFI нетривиальна; Я не могу просто бросить несколько строк кода для вас, чтобы использовать. Также помните, что я сам не писал этот код; Код rEFInd был внесен в проект кем-то еще, и хотя я просмотрел код Кловера, я не могу утверждать, что понял его. Я немного изменил загрузочный код rEFInd в режиме BIOS, но, возможно, я не смогу оказать вам большую помощь в адаптации его к вашей собственной программе.

0

Наконец, я успешно загружаю устаревшую ОС или ОС UEFI с кодом UEFI. Устаревшая ОС означает ОС на MBR Disk, ОС UEFI означает приложение efi (это простой способ загрузки изображения, мы можем его использовать).

Причиной, по которой я не смог загрузить устаревшую ОС, является отсутствие опции. Я создаю опцию с BdsCreateOneLegacyBootOption и обновляю L "BootOrder", затем LegacyBoot в EFI_LEGACY_BIOS_PROTOCOL будет работать, если я выберу вариант загрузки, созданный BdsCreateOneLegacyBootOption. LegacyBoot нужен Devictpath, я извлек DevicePath из начальной загрузки, которая была создана BdsCreateOneLegacyBootOption, и optiondata из начальной загрузки, которая была создана BdsCreateOneLegacyBootOption. Я потерпел неудачу, если я выбрал загрузку в bootmenu, вызвав defent devicepath и optiondata. Bootoption изменился после перезагрузки, возможно, системная плата сделала то, чего я не знаю.

PS: функция BdsCreateOneLegacyBootOption нуждается в BBSTable, и для экспорта списка загрузчиков мы должны обновить список загрузчиков в переменной L "BootOrder". Таблицы BBSTable могут быть созданы GetBbsInfo в EFI_LEGACY_BIOS_PROTOCOL.

0

Legacy os win7 запустится, если я ничего не сделаю.

Отлично. Итак, есть ли проблема?

Я думаю, я сосредоточусь на названии вопроса: Как загрузить устаревшую ОС на MBR-диск с UEFI-кодом ....

Pphf. Забудь это.

(U)EFI - это, по сути, базовое программное обеспечение, которое запускается при включении компьютера. Итак, если (U)EFI делает то же самое, то почему бы нам просто не назвать это «Базовая система ввода / вывода», точно так же, как предыдущее программное обеспечение, которое использовалось для загрузки таких старых операционных систем?

Причина, по которой мы дали (U)EFI новое имя, заключается в том, что оно не совместимо. Это была новая система, разработанная с нуля.

Или, на самом деле, это не было совместимо. Недавно я заметил, что появились новые настройки, связанные с поддержкой "Legacy". Поэтому, возможно, в более новых версиях была добавлена поддержка совместимости со старыми способами ведения дел. Но вы не можете ожидать запуска старого программного обеспечения, если решите отключить функции, обеспечивающие совместимость с устаревшей поддержкой.

Самая известная задача BIOS - выполнять POST и предоставлять операционной системе несколько основных способов взаимодействия с аппаратным обеспечением при запуске операционной системы. Однако, по крайней мере, некоторые операционные системы будут продолжать взаимодействовать с BIOS после того, как операционная система будет работать в течение длительного времени. Например, когда компьютер пытается получить доступ к диску для доступа к данным, операционная система может использовать свой собственный код или операционная система может просто передавать некоторые запросы некоторому программному коду, который является частью BIOS. (Детали могут зависеть от того, какую операционную систему вы используете, а также от того, какие драйверы вы используете.)

Если вы собираетесь использовать операционную систему, которая рассчитана на использование BIOS, вам необходимо предоставить совместимый с BIOS программный код, используя реальный загрузочный чип BIOS или, возможно, какую-то унаследованную функцию (U)EFI. Вы не можете просто использовать (U)EFI без этой устаревшей поддержки; вот почему (U)EFI было дано новое имя.

По сути, (U)EFI (изначально) был разработан для поддержки GPT, а не полагался на MBR.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .