Como carregar o sistema operacional legado no disco mbr com código uefi

0

Estou programando com o EDK2, desejo carregar um sistema operacional legado com meu aplicativo UEFI no modo UEFI.

O firmware suporta UEFI / Legacy. O legado do win7 vai começar, se eu não fizer nada. O shell do efi será iniciado se eu escolher inicializar a partir do meu dispositivo de bloco usb fat32 com um shell efi.

Eu li o código-fonte em UDK2014 \ IntelFrameworkModulePkg \ Library \ GenericBdsLib (UDK2014 é meu espaço de trabalho para edk2), a função LegacyBoot em EFI_LEGACY_BIOS_PROTOCOL não deu certo, eu falhei novamente mesmo se o link para GenericBdsLib, eu don ' Não sei qual detalhe eu ingorei. peça ajuda !!!

    
por yawen jiang 09.03.2017 / 05:28

3 respostas

0

Por fim, o sucesso de inicializar um sistema operacional legado ou sistema operacional UEFI com código UEFI. O sistema operacional legado significa o sistema operacional em disco MBR, o sistema operacional UEFI significa um aplicativo efi (é uma maneira simples de carregar uma imagem, podemos armazená-la) .

O motivo de eu não conseguir inicializar um sistema operacional legado é a opção ausente. Eu crio uma opção com BdsCreateOneLegacyBootOption e atualizo L "BootOrder", então LegacyBoot em EFI_LEGACY_BIOS_PROTOCOL funciona se eu escolher a opção de boot criada por BdsCreateOneLegacyBootOption. O LegacyBoot precisa de um Devictpath, extraí o DevicePath da bootoption que foi criada por BdsCreateOneLegacyBootOption e os dados de opção da bootoption que foi criada por BdsCreateOneLegacyBootOption. Eu falhei se eu escolher o bootoption no bootmenu, causar o devicepath e optiondata deferent. A bootoption mudou após a reinicialização, talvez a mainboard fez algo que eu não sei.

PS: A função BdsCreateOneLegacyBootOption precisa de um BBSTable, e exporta uma lista de bootorder, devemos atualizar a lista de bootorder na variável L "BootOrder". BBSTables podem ser criados por GetBbsInfo em EFI_LEGACY_BIOS_PROTOCOL.

    
por 14.03.2017 / 04:09
1

Primeiro: por que se incomodar? Isso pode soar como um comentário malicioso e desdenhoso, mas é uma questão séria. Existem motivos legítimos para inicializar um SO de modo BIOS em um computador baseado em EFI, mas sua pergunta não apresenta motivação para isso. De uma perspectiva de programação, essa tarefa é uma dor; e como você diz que o sistema operacional de destino é o Windows 7, que suporta a inicialização no modo EFI, não está nem remotamente claro para mim que vale a pena o esforço. Além disso, existem três maneiras existentes de fazer isso, sem que um novo código seja escrito ...

A primeira maneira de fazer isso é usar o gerenciador de boot interno do seu computador. Ele deve apresentar opções para inicializar qualquer sistema operacional de modo EFI que você tenha instalado ou no modo BIOS / CSM / legado. Os detalhes de como acessar este menu variam de um computador para outro, porém, e os detalhes do que aparecerá no menu irão variar. Mais comumente, as inicializações do modo BIOS dos discos são identificadas pelo fabricante ou pelo número do modelo do disco, enquanto as entradas no modo EFI recebem nomes associados ao SO, como Windows boot manager . O resultado do uso desse método não será exatamente o que você descreveu (ou seja, iniciar o Windows a partir do seu próprio aplicativo EFI), mas pode ser adequado às suas necessidades.

O segundo método é usar meu gerenciador de inicialização do rEFInd. Como o gerenciador de inicialização interno do computador, o rEFInd permite que você inicie Carregadores de inicialização no modo BIOS ou no modo EFI (desde que o firmware suporte ambos). Uma ressalva é que, em PCs baseados em UEFI, esse recurso está desabilitado por padrão; você deve editar refind.conf para descomentar a linha scanfor e garantir que hdbios esteja entre as opções. (Se o SO de modo de BIOS de destino estiver em um disco ou CD externo, há outras palavras-chave para eles - consulte os comentários no arquivo refind.conf para obter detalhes.) Como o gerenciador de inicialização interno, essa solução não exatamente faça o que você diz que quer, mas pode ser adequado. Além disso, você pode fazer com que seu aplicativo inicie o rEFInd, que você pode configurar com um tempo limite curto para iniciar o sistema operacional do modo BIOS por padrão. Essa abordagem teria exatamente o efeito desejado, embora o rEFInd tenha uma sobrecarga significativa, portanto, seria uma solução bastante deselegante.

rEFInd também é relevante para sua pergunta porque inclui código para fazer o que você deseja. Você deve se concentrar nos arquivos de código de origem refind/legacy.c e EfiLib/legacy.c . Esteja ciente, entretanto, de que o rEFInd inclui dois caminhos de inicialização no modo legado BIOS / CSM / totalmente distintos, um para Macs e outro para PCs baseados em UEFI. Como você se refere especificamente ao UEFI, é provável que você deseje o último, não o primeiro. No arquivo refind/legacy.c , o código UEFI reside principalmente em funções cujos nomes incluem a string UEFI ; as outras funções são para o Mac. O arquivo EfiLib/legacy.c contém o código do caminho UEFI exclusivamente; mas a maioria dessas funções são tiradas do TianoCore EDK2, então você pode não precisar duplicá-las. (Como o rEFInd é projetado para ser construído com EDK2 ou GNU-EFI, acabei extraindo muito código EDK2 para que ele possa ser construído com o GNU-EFI.) OTOH, essas funções podem ter sido modificadas a partir de suas origens EDK2 , então você pode precisar fazer mais ajustes para fazer as coisas funcionarem corretamente se você usar os originais do EDK2. Observe que o rEFInd usa a GPLv3, portanto, se você pretende distribuir seu programa, o uso do código rEFInd exigirá o uso da GPLv3 ou de uma licença compatível.

A terceira maneira de fazer o trabalho é usar o gerenciador de boot do Clover. Este é um gerenciador de boot do Hackintosh que, como rEFInd, é parcialmente derivado do mais antigo (e agora abandonado) gerenciador de inicialização do rEFIt. Como o rEFInd, o Clover inclui código para iniciar o SO do modo BIOS ; no entanto, o faz de uma maneira diferente do que o rEFInd faz. Você poderia usar o Clover como se usasse o rEFInd, seja como uma parte do caminho de inicialização ou como código de exemplo para extrair e incorporar em seu próprio programa. Embora a página Sourceforge da Clover diga que usa a licença BSD, isso não é inteiramente verdade; alguns dos arquivos de código-fonte especificam que ele usa o GPL.

Infelizmente, como você logo descobrirá se começar a examinar o código do rEFInd ou do Clover, a tarefa de iniciar um carregador de inicialização no modo BIOS a partir do EFI não é trivial; Eu não posso simplesmente jogar algumas linhas de código para você usar. Além disso, esteja ciente de que eu não escrevi este código eu mesmo; O código de rEFInd foi contribuído para o projeto por outra pessoa e, embora eu tenha lido o código de Clover, não posso afirmar que o entendi. Modifiquei um pouco o código de inicialização do BIOS no modo rEFInd, mas talvez não seja capaz de fornecer muita ajuda a você para adaptá-lo ao seu próprio programa.

    
por 12.03.2017 / 23:50
0

The legacy os win7 will start, if I do nothing.

Ótimo. Então, há algum problema?

Acho que vou focar no título da pergunta: Como carregar um sistema operacional herdado no disco MBR com código UEFI ...

Pphf. Esqueça isso.

(U) EFI é essencialmente o software básico que inicia quando o computador é ligado. Então, se (U) EFI faz a mesma coisa, então por que não o chamamos de "Basic Input / Output System", assim como o software anterior que foi usado para inicializar esses sistemas operacionais antigos?

A razão que deu um novo nome a (U) EFI é porque não é compatível. Foi um novo sistema projetado do zero.

Ou, bem, na verdade, não era compatível. Tenho notado ultimamente que há algumas novas configurações relacionadas ao suporte "Legado". Então talvez versões mais recentes tenham adicionado algum suporte para compatibilidade com as antigas formas de fazer as coisas. Mas você não pode esperar executar o software mais antigo se estiver optando por desativar os recursos que fornecem compatibilidade com o suporte legado.

O trabalho mais famoso do BIOS é fazer coisas como executar um POST e fornecer ao sistema operacional algumas maneiras básicas de interagir com o hardware quando o sistema operacional é iniciado. No entanto, pelo menos alguns sistemas operacionais continuariam a interagir com o BIOS bem depois que o sistema operacional estivesse em execução por um longo tempo. Por exemplo, quando o computador tenta acessar uma unidade para acessar dados, o sistema operacional pode usar seu próprio código ou o sistema operacional pode apenas transmitir algumas solicitações para algum código de programação que faz parte do BIOS. (Os detalhes podem depender de qual sistema operacional você usa e detalhes como quais drivers você usa.)

Se você for usar um sistema operacional projetado para depender do BIOS, é necessário fornecer o código de programação compatível com o BIOS, usando um chip de inicialização real do BIOS ou talvez algum tipo de legado (U) EFI característica. Você não pode simplesmente usar (U) EFI sem esse suporte legado; é por isso que (U) EFI recebeu um novo nome.

Basicamente, (U) o EFI foi (inicialmente) projetado para suportar o GPT, em vez de confiar no MBR.

    
por 10.03.2017 / 10:02

Tags