Protected Democode 에서
인터넷에 있는 Protected Democode 를 도스용이 아닌 부팅하여 바로 전환되게 하려고 해 보았습니다.
문제점이 있었는데, 해결방법을 모르겠습니다.
일단 부트섹터는 플로피 디스크의 바로 뒤에 있는 섹터의 코드를 0x1000에 넣고, 0x1000:0000 으로 세그먼트를 바꾸어 점프합니다.
코드는 아래와 같습니다. 작동에는 이상이 없었습니다.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[org 0]
jmp 07C0h:start ; Goto segment 07C0
start:
; Update the segment registers
mov ax, cs
mov ds, ax
mov es, ax
reset: ; Reset the floppy drive
mov ax, 0 ;
mov dl, 0 ; Drive=0 (=A)
int 13h ;
jc reset ; ERROR => reset again
read:
mov ax, 1000h ; ES:BX = 1000:0000
mov es, ax ;
mov bx, 0 ;
mov ah, 2 ; Load disk data to ES:BX
mov al, 2 ; Load 5 sectors
mov ch, 0 ; Cylinder=0
mov cl, 2 ; Sector=2
mov dh, 0 ; Head=0
mov dl, 0 ; Drive=0
int 13h ; Read!
jc read ; ERROR => Try again
jmp 1000h:0000 ; Jump to the program
times 510-($-$$) db 0
dw 0AA55h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
문제가 있었던 곳은 Protected Mode Democode 1번의 소스인데요...
너무 길어서 앞부분만 올립니다.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[BITS 16]
[ORG 0]
start:
mov ax, cs
mov ds, ax
xor ebx, ebx
mov bx, ds
shl ebx, 4
mov eax, ebx
mov [gdt2+2], ax ; GDT테이블영역에
mov [gdt3+2], ax ; 베이스어드레스등 이러저러한 것을
mov [gdt4+2], ax ; 설정합니다.
mov [gdt5+2], ax ; limit은 0xFFFF로 설정되어 있음.
; GDT는 지금 올린 글에 나와있지
; 않습니다.
shr eax, 16
mov [gdt2+4], al
mov [gdt3+4], al
mov [gdt4+4], al
mov [gdt5+4], al
mov [gdt2+7], ah
mov [gdt3+7], ah
mov [gdt4+7], ah
mov [gdt5+7], ah
lea eax, [gdt+ebx] ; lgdt 명령을 위하여
mov [gdtr+2], eax ; GDT 테이블의 베이스어드레스와
; 크기를 설정.
cli
lgdt [gdtr]
mov eax, cr0
or al, 1
mov cr0, eax ;<-----------문제의 코드
jmp SYS_CODE_SEL:do_pm ; 프로텍티드 모드로...
; SYS_CODE_SEL은
; GDT디스크립터중 하나.
; 32비트 코드의 위치를
; 가리킴.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
화면에 글자를 프린트하는 코드를 넣어서 확인해 보니,
위의 문제의 코드 부분에서 PC가 재부팅 해버립니다.
왜 그런지 이해를 못 하겠습니다.
왜 cr0 레지스터에 값을 쓸 수 없는 건가요?
코드 앞 부분은 정상적으로 실행되는 것 같습니다.
좋은 답변 부탁드립니다.
빨리 제 OS를 만들어 보고 싶습니다. t('_'t)
이만...
삽질 엄청 했슴당..-_-;[code:1][BITS 1
삽질 엄청 했슴당..-_-;
위 코드는 base address만 설정합니다.
따라서 limit도 설정하려면,
mov ax,0xffff
mov [gdtr],ax
를 추가해야 합니다.
위에서 cr0의 PE bit를 1로 세팅하는 부분은 아무문제 없습니다.
아래는 코드의 뒷부분을 더 추가하고 약간 수정한 코드입니다:
댓글 달기