문제

부트 로더를 작성하고 있으며 대부분의 세부 사항이 다운되었지만 일부 부트 로더가 대부분의 실행을 시작하기 전에 메모리로 재배치하는 이유는 확실하지 않습니다.

누구든지 이것을 설명 할 수 있습니까?

이 행동의 예는 다음과 같습니다 원래 V0.01 Linux 커널 부트 로더 다음 주석이 있습니다.

Boot.s는 Bios-Startup 루틴에 의해 0x7c00에로드되며 0x90000을 해결하는 방법에서 벗어나 점프합니다.

도움이 되었습니까?

해결책

링크 된 기사에서 :

실제로 MBR에는 일반적으로 다른 부트 로더를로드하는 목적으로 파티션 중 하나의 시작 부분에서 찾을 수있는 부팅 로더가 포함되어 있습니다. 이것은 종종 첫 번째 파티션을 활성화하고 첫 번째 섹터를 RAM에로드하고 실행을 시작하는 매우 간단한 프로그램입니다. 컨벤션에 의해 새로운 부트 로더도 7C00H를 흡수하기 위해로드되므로 이전 로더는이 작업을 수행하기 전에 다른 위치로 전부 또는 일부를 이전해야 할 수도 있습니다. 또한 ES : SI는 파티션 테이블의 RAM에 주소를 포함하고 부트 드라이브 번호를 포함 할 것으로 예상됩니다. 이러한 규칙을 깨뜨리면 부트 로더가 다른 부트 로더와 호환되지 않을 수 있습니다.

다른 팁

Cookieoffortune은 본질적으로 정확합니다 (초기 부트 로더가있는 곳으로 무언가를 옮기고 싶었 기 때문에). 그러나 두 번째 부트 로더가 아니라 커널 자체를위한 것이 아닙니다.

그의 의견에서 :

그런 다음 BIOS 인터럽트를 사용하여 시스템을 0x10000에로드합니다. 그 후 모든 인터럽트를 비활성화하고 시스템을 0x0000으로 이동하고 보호 모드로 변경하며 시스템 시작을 호출합니다. 그런 다음 시스템은 자체 테이블에서 보호 모드를 다시 시작하고 필요에 따라 인터럽트를 활성화해야합니다.

그는 커널이 0x0000 ... 0xkernel_size-1에 위치하기를 원하지만 초기 부트 로더는 현재 0x7c00에 있으므로 커널이 ~ 32 kb 이상인 경우 부트 로더를 이동할 때 부트 로더를 덮어 쓰게됩니다. 커널이 0x0000에 있다는 사실은 다음을 설명합니다.

"참고! 현재 시스템은 최대 8*65536 바이트 길이입니다."

0에서 시작하여 512 kb보다 길면 x86 주소 공간의 예약 영역에 도달 할 위험이 있습니다.

이 코드 섹션에 실제 점프가 포함되어 있다고 생각합니다.

mov ax,#0x0001  | protected mode (PE) bit
lmsw    ax      | This is it!
jmpi    0,8     | jmp offset 0 of segment 8 (cs)

때로는 부트 로더가 ROM에 있으며 어느 시점에서 RAM에 복사해야합니다.

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