2012-01-16 4 views
2

kolibri 부트 로더가있는 간단한 커널을 실행하려고했습니다. 1000 : 0000에로드 중입니다. 이해가 안 ,이 부분에 무슨 일이야 : 디버거에서X86 : 보호 모드, GDT, IDT

... 
; switch to PM 
mov eax, cr0 
or al, 1 
mov cr0, eax 

use32 
PROTECTED_ENTRY: 
mov ax, 00010000b ; DATA 
mov ds, ax 
mov ss, ax 
mov esp, 0xFFFF 

jmp $ 

mov ax, 00011000b ; VIDEO 
mov es, ax 
mov edi, 0 

mov esi, string 
int 1 

jmp $ 

'원인은 여기에 무슨 일이 enter image description here

처럼 보인다? ES와 DS가 변경되지 않는 이유는 무엇입니까?

P. 내가 KOLIBRI 로더 작업이 커널 얻으려고 : http://wasm.ru/article.php?article=ia32int

답변

3

프로세서는 자동 보호 모드로 전환되지 않습니다. 그 후에 cs이 변경되면 보호 모드로 들어갑니다. 가장 쉬운 방법은 cr0에 기록한 직후 먼 점프를 삽입하는 것입니다.

mov cr0, eax 
.db 066h 
jmp CODE_SEGMENT:PROTECTED_ENTRY 

use32 
PROTECTED_ENTRY: 

잘하면 나는 그랬다. (나는 & T 문법에 익숙하다.) 그 .db은 32 비트 주소를 허용하는 피연산자 크기 오버라이드이다.

2

티 디버거가 32 비트 코드를 분해 않는 16 비트 코드로 (당신은 use32 의사 연산 32 비트 코드를 생성하도록 어셈블러 말했다). 따라서 명령어 mov ax, 10h은 부분이 실제로 다음 명령어 인 opcode 인 mov ds,axmov eax, d88e0010h으로 해석됩니다.

mov esp, 0xffff과 유사하며 mov sp, 0xffff으로 해석되며 두 개의 0 바이트가 추가로 가짜 add byte ptr... 명령어로 표시됩니다. 프로세서가 실제로 실행 무엇

는 현재 상태에 따라 달라집니다 -이 상태가 알아 등록 봐 보호 모드, 리얼 모드, 평면 모드 등입니다. 디버거에 다른 코드를 해석하도록 지시 할 수 있습니다. 당신이 cr0에 보호 비트를 설정하면