Як завантажити застарілу ОС на mbr диск з кодом uefi


0

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

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

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

Відповіді:


1

По-перше: навіщо турбуватися? Це може здатися чудовим і зневажливим коментарем, але це серйозний запит. Там є законними причини для завантаження операційної системи BIOS режиму на комп'ютері EFI основи, але ваше запитання не представляє ніякої мотивації для цього. З точки зору програмування, це завдання - біль; і як ви кажете, цільова ОС - це Windows 7, яка підтримує завантаження в режимі EFI, мені навіть далеко не зрозуміло, що варто докласти зусиль. Крім того, є три існуючі способи зробити це, без нового коду.

Перший спосіб зробити це - використовувати вбудований менеджер завантаження вашого комп'ютера. У ньому повинні бути запропоновані варіанти для завантаження будь-якої ОС, встановленої в режимі EFI, або в режимі BIOS / CSM / спадщини. Однак відомості про доступ до цього меню відрізняються від комп'ютера до іншого, і деталі того, що з’явиться в меню, будуть різними. Найчастіше черевики в режимі BIOS з дисків ідентифікуються виробником або номером моделі, тоді як записи в режимі EFI надаються імена, пов'язані з ОС, наприклад Windows boot manager. Результатом використання цього методу буде не саме те, що ви описуєте (а саме, запуск Windows із власного додатку EFI), але це може бути адекватним вашим потребам.

Другий метод - використовувати мій менеджер завантаження rEFInd. Як і вбудований менеджер завантаження комп'ютера, rEFInd дозволяє запускати завантажувачі завантажувачів у режимі BIOS або EFI (за умови, що вбудована програма підтримує обоє). Одне застереження полягає в тому, що на комп'ютерах, що базуються на UEFI, ця функція за замовчуванням відключена; ви повинні змінити, refind.confщоб не коментувати scanforрядок і переконатися, що hdbiosце один із варіантів. (Якщо цільова ОС в режимі BIOS знаходиться на зовнішньому диску або компакт-диску, є інші ключові слова для них - див. Коментарі у refind.confфайлі для деталей.) Як і вбудований диспетчер завантаження, це рішення точно не буде.робіть те, що ви кажете, що хочете, але це може бути адекватним. Крім того, у вас може бути запуск програми rEFInd, який ви можете налаштувати за короткий час, щоб запустити ОС BI-режиму за замовчуванням. Такий підхід матиме саме той ефект, якого ви хочете, хоча rEFInd несе значні витрати, тому це було б досить неелегантним рішенням.

rEFInd також має відношення до вашого питання, оскільки він включає код, щоб робити те, що ви хочете. Ви повинні зосередитись на файлах refind/legacy.cта EfiLib/legacy.cвихідному коді. Будьте в курсі, що rEFInd включає два цілком різних BIOS / CSM / застарілих режимів завантажувальних шляхів, один для Mac і один для ПК на базі UEFI. Оскільки ви конкретно посилаєтесь на УЄФІ, швидше за все, хочете останнього, а не першого. У refind/legacy.cфайлі код UEFI розташований здебільшого у функціях, імена яких містять рядок UEFI; інші функції призначені для Mac. TheEfiLib/legacy.cфайл містить виключно код шляху UEFI; але більшість цих функцій взяті з TianoCore EDK2, тому можливо вам не потрібно буде їх дублювати. (Оскільки rEFInd призначений для побудови з EDK2 або GNU-EFI, я закінчив витягнути багато коду EDK2, щоб його можна було побудувати за допомогою GNU-EFI.) , тож вам знадобиться зробити більше налаштувань, щоб правильно працювати, якщо ви використовуєте оригінали EDK2. Зауважте, що rEFInd використовує GPLv3, тому, якщо ви плануєте поширювати свою програму, для використання коду rEFInd буде потрібно використання GPLv3 або сумісної ліцензії.

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

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


Дякуємо за твою врагу. Я вже читав вихідний код у менеджері завантаження Clover. Це корисно. І я нарешті успішно завантажую спадщину OS або UEFI os після того, як користувач вибере
yawen jiang

0

Починається спадщина 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.


Існує кілька плат, які можуть завантажувати UEFI OS або Legacy OS, це залежить від того, який варіант ви виберете в меню завантаження. напр. спадщина або UEFI відображатиметься у меню завантаження, якщо ви встановили спадщину OS та вставили usb оболонки, то ви можете вибрати варіант завантаження. Що я хочу зробити, це завантажувати пристрій, який вибирає користувач.
yawen jiang

0

Нарешті, я успішно завантажую спадщину ОС або UEFI OS з кодом UEFI, застаріла ОС означає ОС на диску MBR, UEFI OS означає додаток efi (це простий спосіб завантаження зображення, ми можемо його перекласти).

Яка причина, що я не зміг завантажувати спадщину OS - це відсутність параметра. Я створюю опцію за допомогою BdsCreateOneLegacyBootOption та оновлюю L "BootOrder", після чого LegacyBoot в EFI_LEGACY_BIOS_PROTOCOL відпрацьовую, якщо я вибираю завантажувальну систему, створену BdsCreateOneLegacyBootOption. LegacyBoot потребує Devictpath, я витягнув DevicePath з завантажувальної програми, створеної BdsCreateOneLegacyBootOption, і опціонетів із завантаження, які створив BdsCreateOneLegacyBootOption. Не вдалося, якщо я вибираю завантажувальну систему у завантажувальному меню, викликаю шлях до пристрою та optiondata. Завантаження змінилася після перезавантаження, можливо, плата зробила щось, чого я не знаю.

PS: Для функції BdsCreateOneLegacyBootOption потрібен BBSTable, і експортуємо список завантаження, ми повинні оновити список завантаження у змінній L "BootOrder". BBSTables можна створити GetBbsInfo в EFI_LEGACY_BIOS_PROTOCOL.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.