GDT 로드 이후에 CR0의 최하위비트(PE비트) 를 1로 세트시켜야 Protected Mode로 진입하게 된다.
허나 세트하는 명령을 실행한 순간에도 CPU에서 그 다음 명령(16비트)이 해석 중에 있기 때문에 오류가 생길 수 있다. 그래서 이런 파이프라인을 해제하기 위해 jmp 문을 사용한다.
mov eax, cr0
or eax, 0x00000001
mov cr0, eax
jmp $+2
nop
nop
db 0x66
db 0x67
db 0xEA
dd PM_Start
dw SysCodeSelector
jmp 문 이후에 0x66 0x67 등 데이터들이 있는 것을 볼 수 있는데, 0x66 0x67은 prefix로 CPU에게 16비트 명령이 32비트로 바뀌었거나 그 반대의 경우를 알리는데 쓰는 표시이다.
즉 Protected Mode에서 JMP DWORD SysCodeSelector:PM_Start 의 명령을 수행하게 된다.
'Study > Kenrel' 카테고리의 다른 글
PIC 초기화 (0) | 2015.09.24 |
---|---|
IDT(Interrupt Descriptor Table) (0) | 2015.09.24 |
GDT(Global Descriptor Table) (0) | 2015.09.23 |
Segment & Offset (0) | 2015.09.21 |
Real Mode & Protected Mode (0) | 2015.09.21 |