내가 아는 한, 보호 모드는 커널에서 활성화되는 반면, grub 단계에서는 여전히 리얼 모드입니다. 내 오해는: 리얼 모드에서 사용 가능한 총 메모리는 1MB 미만인데, grub은 커널이나 루트 파일 시스템(보통 1MB보다 큼)을 어떻게 메모리에 로드합니까?
답변1
GRUB는 전체 커널을 메모리에 로드할 필요가 없습니다. 커널 이미지는 두 부분으로 나뉩니다.
- 리얼 모드 커널 코드는 작으며 640kB의 사용 가능한 메모리 임계값 내에서 로드될 수 있습니다.
- 커널의 나머지 부분은 보호 모드에서 실행되며 메모리의 첫 번째 메가바이트 이후에 로드됩니다.
부트로더는 리얼 모드 커널 코드만 로드하고 나머지는 다시 부팅합니다(참고자료 참조 go_to_protected_mode()
) arch/x86/boot/pm.c
. 이것이 프로세스가 리얼 모드에서 실행되는 메모리 제한 내에서 유지되는 방법입니다.
팁: GRUB는 다음에서 실행될 수 있습니다.둘 다수행 중인 작업에 따라 실제 모드와 보호 모드가 있습니다. 특정 작업(특정 하드웨어 감지 및 메뉴 표시)에 대해서는 보호 모드로 전환될 수 있습니다. 그러나 커널에 도달하면 리얼 모드에 있다고 생각하는 것이 맞습니다.
답변2
이는 BIOS int 0x15, 0x87 기능을 통해 리얼 모드에서 수행될 수 있습니다. GDT는 소스와 타겟에 대해 올바르게 작성되어야 합니다. cx
- 이동할 바이트 수입니다.
push edx
push es
xor ax, ax
mov es, ax
mov ah, 0x87
mov si, gdt
int 0x15
jc error
pop es
pop edx
ret
gdt:
times 16 db 0
dw 0xffff ; segment limit
.src:
dw 0
db 2
db 0x93 ; data access rights
dw 0
dw 0xffff ; segment limit
.dest:
dw 0
db 0x10 ; load protected-mode kernel to 100000h
db 0x93 ; data access rights
dw 0
times 16 db 0
error: