Unreal Mode - Problem
Posted: Wed Oct 15, 2008 3:44 pm
Hello, I´m Developing my own BootLoaded.. i need help, what im doing wrong here?
1) Goto ProtectMode
2) Back To RealMode
3) Set ES To Read With Selector That Point To Base Adddr 0, but insteant it point to 80 Why Its That?
Here Its The Code...
Thanks you
1) Goto ProtectMode
2) Back To RealMode
3) Set ES To Read With Selector That Point To Base Adddr 0, but insteant it point to 80 Why Its That?
Here Its The Code...
Code: Select all
PROCESSOR_setvoodomode:
SMSW AX
TEST AL,0x1
JE .STARTUNREAL
XSystemCriticalError PROC_ALREADYPM
.STARTUNREAL:
XOR EAX,EAX
MOV AX,CS
SHL EAX,0x4
MOV WORD[DS:SYS_CODE + 2],AX
MOV WORD[DS:SYS_DATA + 2],AX
MOV WORD[DS:REAL_CODE + 2],AX
MOV WORD[DS:REAL_DATA + 2],AX
;Set Physical Lineal Address
LEA EBX,[GDT + EAX]
MOV DWORD[GDT_START+2],EBX
SHR EAX,0x10
MOV BYTE[DS:SYS_CODE + 4],AL
MOV BYTE[DS:SYS_DATA + 4],AL
MOV BYTE[DS:REAL_CODE + 4],AL
MOV BYTE[DS:REAL_DATA + 4],AL
MOV BYTE[DS:SYS_CODE + 7],AH
MOV BYTE[DS:SYS_DATA + 7],AH
MOV BYTE[DS:REAL_CODE + 7],AH
MOV BYTE[DS:REAL_DATA + 7],AH
CLI
LGDT [GDT_START]
MOV BP,CS ;Save The CS In BP
MOV EAX,CR0
OR AL,0x1
MOV CR0,EAX
JMP SYS_CODE_SEL:DO_PROTECTMODE
[BITS 32]
DO_PROTECTMODE:
MOV AX,SYS_DATA_SEL
MOV DS,AX
MOV SS,AX
MOV ES,AX
MOV FS,AX
MOV GS,AX
JMP REAL_CODE_SEL:DO_REALMODE
[BITS 16]
DO_REALMODE:
MOV AX,REAL_DATA_SEL
MOV DS,AX
MOV SS,AX
LEA BX,[DO_UNREAL]
PUSH BP
PUSH BX
MOV EAX,CR0
AND AL,0xFE
MOV CR0,EAX
RETF
[BITS 16]
DO_UNREAL:
MOV AX,CS
MOV DS,AX
MOV ES,AX
MOV FS,AX
MOV GS,AX
MOV AX,LDRSTACKSEGMENTLOCATION
MOV SS,AX
STI
RET
[BITS 32]
;; Global Descriptor Table & Interrump Descriptor Table
GDT_START: DW (GDT_END - GDT - 1)
DD (LDRCODESEGMENTSIZE + GDT)
IDT_START: DW (IDT_END - IDT - 1)
DD (LDRCODESEGMENTSIZE + IDT)
GDT: ;0x0
DW 0x0000
DW 0x0000
DB 0x00
DB 0x00
DB 0x00
DB 0x00
LINEAL_DATA_SEL EQU $-GDT ;0x8
LINEAR_SEL:
DW 0xFFFF
DW 0x0000
DB 0x00
DB 0x92
DB 0xCF
DB 0x00
SYS_CODE_SEL EQU $-GDT ;0x10
SYS_CODE:
DW 0xFFFF
DW 0x0000
DB 0x00
DB 0x9A
DB 0xCF
DB 0x00
SYS_DATA_SEL EQU $-GDT ;0x18
SYS_DATA:
DW 0xFFFF
DW 0x0000
DB 0x00
DB 0x92
DB 0xCF
DB 0x00
REAL_CODE_SEL EQU $-GDT ;0x20
REAL_CODE:
DW 0xFFFF
DW 0x0000
DB 0x00
DB 0x9A
DB 0x00
DB 0x00
REAL_DATA_SEL EQU $-GDT ;0x28
REAL_DATA:
DW 0xFFFF
DW 0x0000
DB 0x00
DB 0x92
DB 0x00
DB 0x00
STAGE2_CODE_SEL EQU $-GDT ;0x30
STAGE2_CODE:
DW 0xFFFF
DW 0x9000
DB 0x01
DB 0x9A
DB 0xCF
DB 0x00
STAGE2_DATA_SEL EQU $-GDT
STAGE2_DATA:
DW 0xFFFF
DW 0x9000
DB 0x01
DB 0x92
DB 0xCF
DB 0x00
GDT_END:
[SEGMENT .bss]
IDT:
RESB 256*8
IDT_END:
-----------
MOV EDI,0x19000
MOV AX,0x8
MOV ES,AX -> BASE ADDR OF ES ITs 80 :S
MOV EAX,[ES:EDI] -> I Want To Read 0x0:0x19000