문제

일반 운영 체제가 시작되기 전에 작은 Linux 배포판을 시작하고 싶다고 가정 해 봅시다.

  1. BIOS로드 MBR 및 MBR 실행.
  2. MBR은 Linux 파티션 인 활성 파티션을 찾습니다.
  3. Linux가 시작하고 내가해야 할 일을 수행합니다.
  4. Linux가 종료되고 다시 실제 모드로 전환합니다.
  5. 원래 파티션 부팅 섹터가로드되고 일반 OS가 시작됩니다.

Afaik, 4 단계는 어려운 작업이 될 것이며 Linux 이전의 모든 장치에서 상태를 복원하면 Int13H가 작동합니까? 인터럽트 벡터 테이블을 복원해야합니까? 몇 가지를 언급합니다.

이것은 아마도 기존 프로젝트에서 이루어 졌습니까?

도움이 되었습니까?

해결책

Linux는 일반적으로이를 지원하지 않습니다. 특히 BIOS 및 DOS 프로그램이 예상하지 못하는 방식으로 하드웨어를 다시 이용하기 때문입니다. 그러나 특정 경우에 실제 모드로 다시 전환 할 수있는 인프라가 있습니다 (특히 재부팅) (Arch/x86/Kernel/Reboot.c의 Machine_Real_Restart 참조) - Kexec 또는 Spend에 대한 하드웨어를 재 구선하는 코드가 있습니다. 나는 당신이 이것들의 조합으로 무언가를 할 수 있다고 생각합니다. 그러나 결과가 실제로 DOS 나 Windows가 재부팅에서 볼 수있는 것과 일치할지 모르겠습니다.

훨씬 쉬운 계획은 특정 구성에서 한 번 부팅하도록 설정할 수있는 체인로드 부트 로더를 사용하는 것입니다. 애벌레. Grub-Set-Default를 호출 한 다음 재부팅 할 수 있습니다. Grub가 등장하면 컨트롤을 Windows로 전달합니다. 그런 다음 폴백 OS를 Linux 파티션으로 설정하면 다음 부팅에서 컨트롤이 Linux로 돌아갑니다.

또 다른 옵션은 사용하는 것입니다 Coreboot, 그러나 이것이 Windows 부팅에 대한 프로덕션 준비가되었는지 확실하지 않습니다.

다른 팁

나는 이것을 시도하지 않았으므로 그것이 효과가 있는지 모르겠지만 여기에 간다 :

보호 모드 코드가 시작되기 전에 실행할 실제 모드 코드의 주소를 지정하는 Bzimage 형식 커널 파일의 헤더에 옵션이 있습니다. 실제 커널이 없지만 BIOS와 같이 int 0x13에서 0x7c00을 사용하여 MBR을로드하는 실제 모드 코드가있는 최소 Bzimage 호환 파일을 만들 수 있습니다.

"-t bzimage-x86-real-mode"옵션을 사용하여 bzimage를로드하기 위해 kexec을 사용하는 경우, pe 비트를 CR0의 PE 비트를 재설정하여 (위의 bdonlan)가 지적한 코드를 실행해야합니다. bzimage 헤더 옵션.

bzimage 헤더 옵션은 realmode_swtch라고하며 /usr/src/linux/documentation/x86/boot.txt에 문서화되어 있으며 헤더 형식 코드는 /usr/src/linux/arch/x86/boot/header.s에 있습니다.

당신은 조사 했습니까? Kexec?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top