2009-05-12 4 views
4

보통 운영 체제를 시작하기 전에 작은 리눅스 배포판을 시작하고 싶습니다.리눅스 커널을 종료하고 리얼 모드에서 재개 할 수 있습니까?

  1. BIOS가 MBR을로드하고 MBR을 실행합니다.
  2. MBR은 내 리눅스 파티션 인 활성 파티션을 찾습니다.
  3. 리눅스를 시작하면 필요한 작업을 수행합니다.
  4. 리눅스가 종료되고 다시 실제 모드로 전환됩니다.
  5. 원래 파티션 부트 섹터가로드되고 일반 OS가 시작됩니다.

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

기존 프로젝트에서이 작업을 수행 한 적이 있습니까?

+1

GRUB과 같은 것보다 더 유능한 Linux 기반 부트 로더를 만들려는 의도가 있다면, 이것은 정말로 어렵습니다. 나는 그런 프로젝트를 시작했지만 결코 끝내지 않았다. 그러나 이것은 확실히 가능합니다. Splashtop을 참조하십시오. – Zifre

+1

이것은 정말로 (IMHO) 프로그래밍과 관련이 없습니다. 그러나 IIRC는 일단 x86 또는 호환 프로세서가 보호 모드에 있으면 재설정하지 않고 리얼 모드로 다시 전환 할 수 없습니다. –

+3

글쎄, 나에게 이것은 실제로 프로그래밍하려고했는데, 실제로 이것을 시도하려는 것이므로 질문이된다. 예, 다시 리얼 모드로 전환 할 수 있습니다 (인텔 소프트웨어 설명서 3 9 장). –

답변

4

Linux는 일반적으로 BIOS를 지원하지 않으므로 특히 BIOS 및 DOS 프로그램이 예상하지 못한 방식으로 하드웨어를 다시 초기화합니다. 그러나 특히 재부팅 (arch/x86/kernel/reboot.c의 machine_real_restart 참조) 및 kexec 또는 일시 중단을 위해 하드웨어를 다시 초기화하는 코드가있는 경우 특정 모드에서 다시 실제 모드로 전환 할 수있는 인프라가 있습니다. 나는 당신이 이것들의 조합으로 무언가를 할 수있을 것이라고 생각합니다. 그러나 결과가 도스 나 윈도우가 리부팅시에 기대하는 것과 정말로 일치하는지는 모르겠습니다.

GRUB과 같이 특정 구성에서 한 번 부팅하도록 설정할 수있는 체인로드 부트 로더를 사용하는 것이 훨씬 쉽습니다. grub-set-default를 실행 한 다음 재부팅 할 수 있습니다. GRUB이 나오면 윈도우에 제어권을 넘겨 줄 것이다. 그런 다음 대체 OS를 Linux 파티션으로 설정하면 다음 부팅시 제어가 Linux로 돌아갑니다.

또 다른 옵션은 Coreboot을 사용하는 것이지만 아직 부팅 할 준비가되었는지 확신 할 수 없습니다.

3
나는 그것이 작동 할 경우이 그래서 나도 몰라했지만, 간다하지 않은

: 리얼 모드 코드의 주소를 지정하는 bzImage 행 형식의 커널 파일의 헤더에 옵션이 있습니다

보호 모드 코드가 시작되기 전에 실행해야합니다. 실제 커널이없는 최소 bzImage 호환 파일을 만들 수 있지만 BIOS에서와 같이 INT 0x13 ~ 0x7c00 및 jmp를 사용하여 MBR을로드하는 리얼 모드 코드가 있습니다.

"-t bzImage-x86 --real-mode"옵션을 사용하여 kexec을 사용하여 bzImage를로드하는 경우 CR0의 PE 비트를 리얼 모드 (위에서 언급 한 bdonlan)로 재설정하고 코드를 실행해야합니다 bzImage 헤더 옵션이 가리 킵니다.

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

관련 문제