Pergunta

Vamos dizer que eu gostaria de começar uma pequena distro linux antes meu início sistema operacional comum.

    carga
  1. BIOS MBR e executar MBR.
  2. MBR localiza a partição ativa que é a minha partição linux.
  3. Linux começar e eu realizar o que eu preciso fazer.
  4. Linux desligar e eu mudar para o modo real novamente.
  5. O setor de inicialização partição original é carregado e meu início OS comum.

AFAIK, etapa 4 será a tarefa difícil, restaurar o estado em todos os dispositivos antes de linux, vai INT13H ser funcional? Preciso restaurar a tabela vetor de interrupção? Para mencionar alguns.

Tem este sido feito em qualquer projeto existente talvez?

Foi útil?

Solução

Linux normalmente não suportar isto, particularmente desde que reinitializes hardware de uma forma que os programas de BIOS e DOS não pode esperar. No entanto, há algumas infra-estruturas para voltar ao modo real em casos específicos - em particular, para um reboot (veja machine_real_restart em arch / x86 / kernel / reboot.c) - e tem código para reinicializar hardware para kexec ou suspender. Eu suspeito que você pode ser capaz de fazer algo com uma combinação destes - mas eu não sei se o resultado vai realmente corresponder ao que DOS ou Windows esperaria ver na reinicialização

.

Um plano muito mais fácil seria usar um bootloader Carregamento em série que pode ser configurado para inicializar em uma configuração particular uma vez, como GRUB . Você poderia invocar grub-set-padrão, em seguida, reiniciar. Quando GRUB vem acima, seria então passar o controle off para o Windows. Até então definir o OS fallback para a partição Linux, controle voltaria para Linux na próxima inicialização.

No entanto, outra opção pode ser usar Coreboot , mas eu não tenho certeza se este é a produção apronte para a inicialização do Windows ainda.

Outras dicas

Eu não tentei isso, então eu não sei se ele iria trabalhar, mas aqui vai:

Existe uma opção no cabeçalho de um arquivo do kernel formato bzImage que especifica o endereço do código de modo real para executar antes do início do código de modo protegido. Você poderia criar um arquivo bzImage-compliant mínima que não tem semente real, mas que tem o código de modo real para carregar o MBR usando INT 0x13 para 0x7c00 e JMP para ele como o BIOS faz.

Se você usar kexec para carregar o bzImage usando as opções "-t bzImage-x86 --real-mode", deve repor o bit PE em CR0 cair para realmode (como bdonlan acima indicado) e executar o código pontas pela opção de cabeçalho bzImage.

A opção de cabeçalho bzImage é chamado realmode_swtch e está documentado no /usr/src/linux/Documentation/x86/boot.txt, o código do formato de cabeçalho é em / usr / src / linux / arch / x86 / boot / cabeçalho. S

Você já olhou para kexec ?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top