Autor Thema: PM-Jump  (Gelesen 5187 mal)

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« am: 02. December 2004, 18:24 »
hallo,
ich hoffe mir kann jemand helfen! mit dem befehl hier will ich in den PM springen, nachdem ich ihn an gemacht habe:
jmp dword 0x08:ser0x08_1
mein kernel ist an 0x50 und dieser code steht im kernel, und der deskriptor ist der:
dw 0FFFFh               ; maximum limit 0FFFFFh (1 meg or 4 gig)
dw 0                    ; linear base address
db 0
db 9Ah                  ; present,ring 0,code,non-conforming,readable
db 0CFh                 ; page-granular (4 gig limit), 32-bit
db 0    

ich hoffe, mir kann jemand helfen! es entsteht immer ein reboot unter bocsh...

mfg

JN!
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

GhostCoder

  • Beiträge: 187
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 03. December 2004, 08:25 »
Hiho,

nen bissle Code wäre gut.

MFG GhostCoder
A man, a legend!

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #2 am: 03. December 2004, 12:10 »
naja, das ist der wichtigste teil. bis zu dem jump geht alles. das label ist direkt hinter dem jump...
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

GhostCoder

  • Beiträge: 187
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 03. December 2004, 13:39 »
Hiho,

also aus den zwei Zeilen wird man (bzw. ich net schlau), der Deskriptor sieht eigentlich richtig aus, sonst kannste auch mal die probieren:

dd 0x00000000,0x00000000 ; Dummy
dd 0x0000FFFF,0x00CF9A00 ; 4GB Flat Code, DPL0
dd 0x0000FFFF,0x00CF9200 ; 4GB Flat Data, DPL0


Was ich sonst nicht sehen kann:
Interupts aus? Alle Segmentregister gesetzt? Stack richtig? gdt richtig geladen?

P.S.: Schämste dich für deinen Code?? :)

MfG GhostCoder
A man, a legend!

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #4 am: 03. December 2004, 14:15 »
naja, wieso sollte ich mich für meinen code schähmen??? naja, gut, hier der GANZE code:


jmp word 0x50:ages
ages:
mov ax,cs
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
cli
; ------ Enable protected mode.
; ------ [http://www.karig.net/0004.html]
lgdt [GDT]
mov eax,cr0
or al,1
mov cr0,eax
;jmp dword 0x18:ser0x08_1+0x500
jmp ser0x08_1
[BITS 32]
; ------ Change data-segment limits to four gigabytes.
ser0x08_1:
mov eax,dseg-GDT
mov ds,eax
mov es,eax
mov fs,eax
mov gs,eax
;jmp dword 0x18:ser0x08_2+0x500
jmp ser0x08_2
[BITS 16]
; ------ Disable protected mode; jump to real-mode segment.
ser0x08_2:
mov eax,cr0
and al,0xFE
mov cr0,eax
jmp pm_end
GDT:
dw gdt_limit ; null segment,used to store GDT metadata
dd GDT
dw 0
cseg:
;dd 0xFFFF0000,0x00CF9800 ; code segment,32-bit,0 to 4GB

dw 0FFFFh               ; maximum limit 0FFFFFh (1 meg or 4 gig)
dw 0                    ; linear base address
db 0
db 9Ah                  ; present,ring 0,code,non-conforming,readable
db 0CFh                 ; page-granular (4 gig limit), 32-bit
db 0

dseg:
;dd 0xFFFF0000,0x00CF9200 ; data segment,32-bit,0 to 4GB

dw 0xFFFF
dw 0
db 0
db 0x92
db 0xCF
db 0

cs16:
dd 0x0000FFFF,0x00009800 ; code segment,16-bit,0 to 64KB
ds16:
dd 0x0000FFFF,0x00009200 ; data segment,16-bit,0 to 64KB
gdt_limit equ $-GDT-1
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

GhostCoder

  • Beiträge: 187
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 03. December 2004, 16:07 »
Hiho,

das mit deinem Code war Spass, daher das ":)"!
Naja,


ser0x08_1:
mov eax,dseg-GDT
mov ds,eax
mov es,eax
mov fs,eax
mov gs,eax

würde ich auf

ser0x08_1:
mov ax,16
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax

, da sie Segmentregister alle 16-Bit breit sind, warum das assembler sich da nicht beschwert, verstehe ich net.

Außerdem

jmp ser0x08_1

auf

jmp 8:dword ser0x08_1


Und vor das "lgdt" muss noch folgender Code:

xor eax,eax
mov ax,ds
shl eax,4
add ax,Selectors ; Siehe unten
mov dword [GDT+2],eax


Um die Segment:Offset Addresse in eine 32-Bit Addresse umzuwandeln... Ich kann wirklich nur empfehlen, immer diesen Code zu nehmen, weil wenn oben ein [org ...] fehlt, klappt nichts mehr.

Zum Abschluss ist noch der gdt table falsch. Es fehlt der Dummy Eintrag (Da ein Selektor nicht null sein darf). Da kannste den Code nehmen, oder deinen Fixen...


GDT:
dw 72
dd 0


Selectors:
dd 0x00000000,0x00000000 ; Dummy
dd 0x0000FFFF,0x00CF9A00 ; 4GB Flat Code, DPL0
dd 0x0000FFFF,0x00CF9200 ; 4GB Flat Data, DPL0
dd 0x0000FFFF,0x00CFBA00 ; 4GB Flat Code, DPL1
dd 0x0000FFFF,0x00CFB200 ; 4GB Flat Data, DPL1
dd 0x0000FFFF,0x00CFDA00 ; 4GB Flat Code, DPL2
dd 0x0000FFFF,0x00CFD200 ; 4GB Flat Data, DPL2
dd 0x0000FFFF,0x00CFFA00 ; 4GB Flat Code, DPL3
dd 0x0000FFFF,0x00CFF200 ; 4GB Flat Data, DPL3
A man, a legend!

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #6 am: 03. December 2004, 18:14 »
bringt alles nix *wein*... hier mein jetztiger code:

;INT 0x67-0x08
_int0x67_ser0x08:
jmp word 0x50:ages
ages:
mov ax,cs
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
cli
; ------ Enable protected mode.
; ------ [http://www.karig.net/0004.html]
xor eax,eax
mov ax,ds
shl eax,0x04
add ax,selectors
mov dword [GDT+2],eax
lgdt [GDT]
mov eax,cr0
or al,1
mov cr0,eax
jmp dword 0x8:ser0x08_1
[BITS 32]
; ------ Change data-segment limits to four gigabytes.
ser0x08_1:
mov eax,dseg-GDT
mov ds,eax
mov es,eax
mov fs,eax
mov gs,eax
jmp dword 0x18:ser0x08_2
;jmp ser0x08_2
[BITS 16]
; ------ Disable protected mode; jump to real-mode segment.
ser0x08_2:
mov eax,cr0
and al,0xFE
mov cr0,eax
jmp _int0x67_end
GDT:
dw 72
dd 0

selectors:

dd 0x00000000,0x00000000 ;NULL-Deskriptor

cseg:
;dd 0xFFFF0000,0x00CF9800 ; code segment,32-bit,0 to 4GB

dw 0FFFFh               ; maximum limit 0FFFFFh (1 meg or 4 gig)
dw 0                    ; linear base address
db 0
db 9Ah                  ; present,ring 0,code,non-conforming,readable
db 0CFh                 ; page-granular (4 gig limit), 32-bit
db 0

dseg:
;dd 0xFFFF0000,0x00CF9200 ; data segment,32-bit,0 to 4GB

dw 0xFFFF
dw 0
db 0
db 0x92
db 0xCF
db 0

cs16:
dd 0x0000FFFF,0x00009800 ; code segment,16-bit,0 to 64KB
ds16:
dd 0x0000FFFF,0x00009200 ; data segment,16-bit,0 to 64KB
gdt_limit equ $-GDT-1  
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

GhostCoder

  • Beiträge: 187
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 03. December 2004, 19:59 »
Hiho,


mov eax,dseg-GDT
mov ds,eax
mov es,eax
mov fs,eax
mov gs,eax


es heißt ax!! Außerdem kann dseg-GDT nicht klappen, da nach dem GDT label noch dw+dd kommen... Nimm einfach 16. Wie wärs wenn du mal guckst, ob du richtig in den PMode kommst:


mov esi,0xb8000
mov eax,0xFFFFFFFF
mov [esi],eax
hlt


Wenn nun die ersten Zeichen am Bildschirm weiß werden, klappt schonmal der PMode!

MfG GhostCoder

P.S.:
Hier mal mein Bootloader, der schaltet auch in den PMode, schau dir den Mal an, der klappt...


; Written by the great white GhostCoder
[Bits 16]
[org 0x7C00]


%define COPY_BASE 0x10000
%define KERNEL_BASE 0x100000


Start:
xor ax,ax
mov ds,ax
mov ss,ax
mov sp,0xFFFE


xor bx,bx
mov ax,(COPY_BASE >> 4) & 0xFFFF
mov es,ax

mov cx,10
mov ax,1
.Read:
Call ReadSector
inc ax
push ax
mov ax,es
add ax,0x20
mov es,ax
pop ax
loop .Read

jmp PMode


ReadSector:
push ax
push cx
; Calc chs address for bios call
xor dx,dx
div word [SectorsPerTrack]
inc dl
mov [absoluteSector], dl
xor dx,dx
div word [NumHeads]
mov [absoluteHead],dl
mov [absoluteTrack],al

; Read sector via bios with 5 retries
mov ax,0x0201
mov ch,[absoluteTrack]
mov cl,[absoluteSector]
mov dh,[absoluteHead]
mov dl,0
int 0x13

pop cx
pop ax
ret

absoluteSector db 0x00
absoluteHead db 0x00
absoluteTrack db 0x00
SectorsPerTrack dw 0x0012
NumHeads dw 0x0002



PMode:
xor eax,eax
mov ax,ds
shl eax,4
add ax,Selectors
mov dword [GDT+2],eax

lgdt [GDT]

; Don't allow interrupts anymore
cli

; Enable protected mode
mov eax,cr0
or eax,1
mov cr0,eax

mov ax,16
mov ds,ax
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
mov ss,ax
mov sp,0x5000

; Jump to protected mode code
jmp 8:dword flush
flush:

[Bits 32]
; Copy buffer to above the 1mb mark
mov esi,COPY_BASE
mov edi,KERNEL_BASE
mov ecx,0x4000
rep movsb

jmp KERNEL_BASE


GDT:
dw 72
dd 0


Selectors:
dd 0x00000000,0x00000000 ; Dummy
dd 0x0000FFFF,0x00CF9A00 ; 4GB Flat Code, DPL0
dd 0x0000FFFF,0x00CF9200 ; 4GB Flat Data, DPL0
dd 0x0000FFFF,0x00CFBA00 ; 4GB Flat Code, DPL1
dd 0x0000FFFF,0x00CFB200 ; 4GB Flat Data, DPL1
dd 0x0000FFFF,0x00CFDA00 ; 4GB Flat Code, DPL2
dd 0x0000FFFF,0x00CFD200 ; 4GB Flat Data, DPL2
dd 0x0000FFFF,0x00CFFA00 ; 4GB Flat Code, DPL3
dd 0x0000FFFF,0x00CFF200 ; 4GB Flat Data, DPL3


times 510-($-$$) db 0
dw 0xAA55

A man, a legend!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 03. December 2004, 22:46 »
Zitat von: GhostCoder
Zum Abschluss ist noch der gdt table falsch. Es fehlt der Dummy Eintrag (Da ein Selektor nicht null sein darf).
Der erste Selektor in der GDT kann für alles mögliche "missbraucht" werden. Auch für das GDTR. Ist Gang und Gebe das so zu machen.

Zitat von: GhostCoder
mov eax,dseg-GDT
mov ds,eax
es heißt ax!!
eax geht auch. im 32bit modus ist das ein byte pro instruktion kürzer und funktioniert exakt genauso wie mit ax.

Zitat von: GhostCoder
Außerdem kann dseg-GDT nicht klappen, da nach dem GDT label noch dw+dd kommen...
das geht schon. beides sind offsets die NASM problemlos beim assemblieren voneinander abzieht. man muss bei der verschachtelung von GDT und GDTR nur aufpassen, dass man hinter das GDTR 2 bytes anhängt, damit der nullselektor auch wirklich 8 byte groß ist. (Wie joachim_neu es auch gemacht hat.)
Dieser Text wird unter jedem Beitrag angezeigt.

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #9 am: 03. December 2004, 23:11 »
ok... der PM funktioniert.


_int0x67_ser0x07:
pusha
push ds
push es
mov ah,0x08
int 0x67
xor eax,eax
mov ax,cx
shl ax,3
add ax,0x12
mov edi,eax
shl edi,0x20
mov esi,0x10000
mov ecx,0x40000
rep movsw
pop es
pop ds
popa
jmp _int0x67_end
;INT 0x67-0x08
_int0x67_ser0x08:
jmp word 0x50:ages
ages:
mov ax,cs
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
cli
; ------ Enable protected mode.
; ------ [http://www.karig.net/0004.html]
xor eax,eax
mov ax,ds
shl eax,0x04
add ax,selectors
mov dword [GDT+2],eax
lgdt [GDT]
mov eax,cr0
or al,1
mov cr0,eax

;<----------------------------- hier geht es, wenn der code eingefügt ist

jmp word 0x08:ser0x08_1 ;<========| bei diesem jump kackt er ab
[BITS 32]
; ------ Change data-segment limits to four gigabytes.
ser0x08_1:

;<--------------------hier geht es NICHT, wenn der ausgabe-code eingefügt
;<--------------------ist, weil er bis dahin nicht kommt, sondern beim jump
;<--------------------einen reboot macht...

mov eax,dseg-GDT
mov ds,eax
mov es,eax
mov fs,eax
mov gs,eax
jmp dword 0x18:ser0x08_2
;jmp ser0x08_2
[BITS 16]
; ------ Disable protected mode; jump to real-mode segment.
ser0x08_2:
mov eax,cr0
and al,0xFE
mov cr0,eax
jmp _int0x67_end
GDT:
dw 72
dd 0

selectors:

dd 0x00000000,0x00000000 ;NULL-Deskriptor

cseg:
;dd 0xFFFF0000,0x00CF9800 ; code segment,32-bit,0 to 4GB

dw 0FFFFh               ; maximum limit 0FFFFFh (1 meg or 4 gig)
dw 0                    ; linear base address
db 0
db 9Ah                  ; present,ring 0,code,non-conforming,readable
db 0CFh                 ; page-granular (4 gig limit), 32-bit
db 0

dseg:
;dd 0xFFFF0000,0x00CF9200 ; data segment,32-bit,0 to 4GB

dw 0xFFFF
dw 0
db 0
db 0x92
db 0xCF
db 0

cs16:
dd 0x0000FFFF,0x00009800 ; code segment,16-bit,0 to 64KB
ds16:
dd 0x0000FFFF,0x00009200 ; data segment,16-bit,0 to 64KB
gdt_limit equ $-GDT-1  
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #10 am: 03. December 2004, 23:26 »
UPDATE:


;INT 0x67-0x08
_int0x67_ser0x08:
jmp word 0x50:ages
ages:
mov ax,cs
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
cli
; ------ Enable protected mode.
; ------ [http://www.karig.net/0004.html]
xor eax,eax
mov ax,ds
shl eax,0x04
add ax,selectors
mov dword [GDT+2],eax
lgdt [GDT]
mov eax,cr0
or al,1
mov cr0,eax
jmp dword 0x08:ser0x08_1+0x500
[BITS 32]
; ------ Change data-segment limits to four gigabytes.
ser0x08_1:
mov eax,dseg-selectors       ;<<<<<<<<<<<<<<<*
mov ds,eax
mov es,eax
mov fs,eax
mov gs,eax
jmp dword 0x18:ser0x08_2+0x500
[BITS 16]
; ------ Disable protected mode; jump to real-mode segment.
ser0x08_2:
mov eax,cr0
and al,0xFE
mov cr0,eax
jmp _int0x67_end
GDT:
dw 72
dd 0
selectors:
dd 0x00000000,0x00000000 ;NULL-Deskriptor
cseg:
;dd 0xFFFF0000,0x00CF9800 ; code segment,32-bit,0 to 4GB
dw 0FFFFh               ; maximum limit 0FFFFFh (1 meg or 4 gig)
dw 0                    ; linear base address
db 0
db 9Ah                  ; present,ring 0,code,non-conforming,readable
db 0CFh                 ; page-granular (4 gig limit), 32-bit
db 0
dseg:
dd 0xFFFF0000,0x00CF9200 ; data segment,32-bit,0 to 4GB
cs16:
dd 0x0000FFFF,0x00009800 ; code segment,16-bit,0 to 64KB
ds16:
dd 0x0000FFFF,0x00009200 ; data segment,16-bit,0 to 64KB
gdt_limit equ $-GDT-1


dieser code stürzt nichtmehr ab! es gab mehrere absturzpunkte.
1. der 1. jump
2. der 2. jump
3. laden eines falschen deskriptors bei *

trotzdem tut der code immernoch nicht, was er soll, nähmlich mein mappen funktioniert noch nicht, aber das diskutieren und lösen wir lieber im mappen-/dismappen-thread... herzlichen dank an alle, die mir geholfen haben.
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #11 am: 05. December 2004, 11:09 »
der code geht immernoch nicht, ist jetzt aber auch nichtmehr benötigt, weil sich das problem anderst lösen ließ. vielen dank nochmals!
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

 

Einloggen