Copying does not work in unreal mode
Posted: Wed Jul 19, 2006 11:48 am
Hi,
I 'd been trying to copy my Kernel from linear 0x20000 to 0x100000
(1 mb mark). I already setup Unreal mode, enabled line A20, but to no avail.
This code is the second stage boot loader that was loaded at
0x1000:0x0000 by the first stage boot loader.
Can someone point to me what I'd been doing wrong here, Please.
Here is the code:
%define OS_LOADER_LINEAR 0x10000
[ORG 0]
BITS 16]
JMP START
GdtUnreal:
dw GdtUnreal_end - GdtUnreal_start - 1 ;Size of table
dd GdtUnreal_start + OS_LOADER_LINEAR
GdtUnreal_start:
dw 0, 0, 0, 0 ;Null descriptor, 4 words all set to '0'
dw 0FFFFh ;Part of limit
dw 0 ;Base address 15:00, is 0
db 0 ;Base address 23:16, is 0
db 92h ;Present, ring 0, data, expand-up, writable
db 0CFh?????? ;Granular, 32-bit
db 0
GdtUnreal_end:
START:
CLI
PUSH CS
POP AX
MOV DS, AX
MOV ES, AX
XOR AX, AX
MOV SS, AX
MOV SP,0FFFFH
CALL ENABLE_A20
;Setup for Unreal mode
CLI
LGDT [GdtUnreal]
MOV EAX, CR0
OR AL, 1
MOV CR0, EAX???
???
; leave real-mode cs, ss in place -- just set ds and es
MOV AX, 08H
MOV DS, AX
MOV ES, AX
; back to (un)real mode (big real mode, flat real mode, whatever).
MOV EAX, CR0
AND AL, 0xFE???
MOV CR0, EAX
STI
???
;INITIALLY THE KERNEL WAS LOADED TO 0x2000:0x0000 BY ;THIS SECOND STAGE LOADER???
;COPY THE KERNEL TO 1 MB MARK
???XOR EAX, EAX
???XOR EBX, EBX
???XOR ECX, ECX
???XOR EDI, EDI
???XOR ESI, ESI
???
???
???MOV ES, AX ;SOURCE SEGMENT
???MOV DS, AX ;DESTINATION SEGMENT
???
???MOV ESI, 0x20000 ; SOURCE OFFSET
???MOV EDI, 0x100000 ;DESTINATION OFFSET??????
???MOV ECX, 65536 ;QUANTITY OF BYTES TO COPY
???CLD
???DB 0x67???
???REP MOVSB ;COPY BYTE FROM DS:[ESI] TO ES:[EDI]
RET
ENABLE_A20:
??? CLI
??? XOR CX,CX
.IBEmm0:
IN AL,64H
TEST AL,02
??? LOOPNZ .IBEmm0
MOV AL,0D1H
OUT 64H,AL
??? XOR CX,CX
.IBEmm1:
IN AL,64H
TEST AL,02
??? LOOPNZ .IBEmm1
MOV AL,0DFH
OUT 60H,AL
??? XOR CX,CX
.IBEmm2:
IN AL,64H
TEST AL,02
??? LOOPNZ .IBEmm2
STI
RET
I 'd been trying to copy my Kernel from linear 0x20000 to 0x100000
(1 mb mark). I already setup Unreal mode, enabled line A20, but to no avail.
This code is the second stage boot loader that was loaded at
0x1000:0x0000 by the first stage boot loader.
Can someone point to me what I'd been doing wrong here, Please.
Here is the code:
%define OS_LOADER_LINEAR 0x10000
[ORG 0]
BITS 16]
JMP START
GdtUnreal:
dw GdtUnreal_end - GdtUnreal_start - 1 ;Size of table
dd GdtUnreal_start + OS_LOADER_LINEAR
GdtUnreal_start:
dw 0, 0, 0, 0 ;Null descriptor, 4 words all set to '0'
dw 0FFFFh ;Part of limit
dw 0 ;Base address 15:00, is 0
db 0 ;Base address 23:16, is 0
db 92h ;Present, ring 0, data, expand-up, writable
db 0CFh?????? ;Granular, 32-bit
db 0
GdtUnreal_end:
START:
CLI
PUSH CS
POP AX
MOV DS, AX
MOV ES, AX
XOR AX, AX
MOV SS, AX
MOV SP,0FFFFH
CALL ENABLE_A20
;Setup for Unreal mode
CLI
LGDT [GdtUnreal]
MOV EAX, CR0
OR AL, 1
MOV CR0, EAX???
???
; leave real-mode cs, ss in place -- just set ds and es
MOV AX, 08H
MOV DS, AX
MOV ES, AX
; back to (un)real mode (big real mode, flat real mode, whatever).
MOV EAX, CR0
AND AL, 0xFE???
MOV CR0, EAX
STI
???
;INITIALLY THE KERNEL WAS LOADED TO 0x2000:0x0000 BY ;THIS SECOND STAGE LOADER???
;COPY THE KERNEL TO 1 MB MARK
???XOR EAX, EAX
???XOR EBX, EBX
???XOR ECX, ECX
???XOR EDI, EDI
???XOR ESI, ESI
???
???
???MOV ES, AX ;SOURCE SEGMENT
???MOV DS, AX ;DESTINATION SEGMENT
???
???MOV ESI, 0x20000 ; SOURCE OFFSET
???MOV EDI, 0x100000 ;DESTINATION OFFSET??????
???MOV ECX, 65536 ;QUANTITY OF BYTES TO COPY
???CLD
???DB 0x67???
???REP MOVSB ;COPY BYTE FROM DS:[ESI] TO ES:[EDI]
RET
ENABLE_A20:
??? CLI
??? XOR CX,CX
.IBEmm0:
IN AL,64H
TEST AL,02
??? LOOPNZ .IBEmm0
MOV AL,0D1H
OUT 64H,AL
??? XOR CX,CX
.IBEmm1:
IN AL,64H
TEST AL,02
??? LOOPNZ .IBEmm1
MOV AL,0DFH
OUT 60H,AL
??? XOR CX,CX
.IBEmm2:
IN AL,64H
TEST AL,02
??? LOOPNZ .IBEmm2
STI
RET