Please help me about enter long mode!
=?gb2312?q?Mr=20=BC=FC=20=CE=A4?=
weijian0204 at yahoo.com.cn
Sun Jul 17 05:19:45 GMT 2005
Hi:
Please help me.I can't enter long mode.I'm no good
ideas!If you could give me your assembly code about
how to enter long mode correctly,I can give some
monney.Thank you,very much.
My assembly code:
;----------------------------------------------------------------------
; Processor Initialization
;----------------------------------------------------------------------
bits 16
org 0x7c00
;----------------------------------------------------------------------
GDT_CodeSegment_Selector equ 0x08
;----------------------------------------------------------------------
jmp Initializate_Processor
GDT_Tables:
GDT_Null:
Null_Discriptor1 dd 0x00
Null_Discriptor2 dd 0x00
GDT_CodeSegment_Address equ $-GDT_Tables
GDT_CodeSegment:
dw 0xffff
dw 0x0000
db 0x00
db 10011010b
db 11001111b
db 0x00
GDT_DataSegment_Address equ $-GDT_Tables
GDT_DataSegment:
dw 0xffff
dw 0x0000
db 0x00
db 10010010b
db 11001111b
db 0x00
GDT64_CodeSegment_Address equ $-GDT_Tables
GDT64_CodeSegment:
dd 0x0000
db 0x00
db 10011000b
db 00000000b
db 0x00
GDT_End:
GDT_Address:
dw GDT_End-GDT_Tables-1
dd GDT_Tables
;----------------------------------------------------------------------
IDT_Address:
IDT_Address_Limit dw IDT_End-IDT_Tables-1
IDT_Address_Base dd IDT_Tables
IDT_Tables:
IDT_Discriptor_00:
Target_Code_Segment_Offset1_00 dw 0x0000 ;Low bit
Target_Code_Segment_Selector_00 dw
GDT_CodeSegment_Selector
Attribute_00 dw 0x8e00
Target_Code_Segment_Offset2_00 dw 0x0100 ;High bit
IDT_End:
;
--------------------------------------------------------------------------------------
Initializate_Processor:
Mask_All_IRQ:
mov al,255
out 0xa1,al
out 0x21,al
Enable_A20:
Enable_A20_First:
in al,0x64
test al,2
jnz Enable_A20_First
mov al,0xd1
out 0x64,al
Enable_A20_Second:
in al,0x64
test al,2
jnz Enable_A20_Second
mov al,0xdf
out 0x60,al
Disable_Interrupt:
cli
Load_GDT:
lgdt [GDT_Address]
lidt [IDT_Address]
Enable_ProtectedMode:
mov eax,0x11
mov cr0,eax
jmp GDT_CodeSegment_Address:Code_32
Bits 32
Code_32:
mov ax,GDT_DataSegment_Address
mov ds,ax
mov es,ax
mov ss,ax
mov fs,ax
mov gs,ax
mov esp,0xffff
PAE:
mov edi,0x100000
mov eax,0x110000
add eax,0x01
stosd
mov edi,0x110000
mov eax,0x120000
add eax,0x01
stosd
mov edi,0x120000
mov eax,0x130000
add eax,0x01
stosd
mov edi,0x130000
mov eax,0x000001
mov ecx,0x200
STOSE_PTE:
stosd
add eax,0x1000
add edi,4
loop STOSE_PTE
mov eax,cr4
bts eax,5
mov cr4,eax
mov eax,0x100000 ; page directory
location
mov cr3,eax
mov eax,cr0
mov ecx,0xc0000080
rdmsr
bts eax,8
wrmsr
mov eax,cr0
bts eax,31
mov cr0,eax
db 0x66
db 0xea
dd Start64
dw 0x18
bits 64
Start64:
jmp $
Jian.
07/16/2005
___________________________________________________________
ÑÅ»¢Ãâ·ÑGÓÊÏä£ÖйúµÚÒ»¾øÎÞÀ¬»øÓʼþɧÈų¬´óÓÊÏä
http://cn.mail.yahoo.com/?id=77071
More information about the freebsd-amd64
mailing list