Autor Thema: Pmode?  (Gelesen 17533 mal)

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« am: 14. November 2004, 23:54 »
Hallo,
Ich habe nun TeeJay's code kopiert (jaja, ich weiß, aber ich wollte mir halt mal den PMode in Asm ansehen ;)) und nun wollte ich ein Zeichen ausgeben, doch musste ich feststellen das es nicht funktioniert...mein (Test-) PC blinkt noch (also dieser "_") und rebootet nicht oder so...er gibt nur einfach kein Zeichen aus...kann mir da jemand helfen?


[BITS 16]

jmp Start

DescriptorNull:
dd 0
dd 0

DescriptorCode:
dw 0xFFFF
dw 0
db 0
db 0x9A
db 0xCF
db 0

DescriptorData:
dw 0xFFFF
dw 0
db 0
db 0x92
db 0xCF
db 0

GlobalDescriptorTable:
Limit dw 0
Base dd 0

Start:
cli
mov eax, cs
mov ds, ax

shl eax, 4
mov [DescriptorCode+2], ax
mov [DescriptorData+2], ax
shr eax, 16
mov [DescriptorCode+4], al
mov [DescriptorData+4], al

mov eax, cs
shl eax, 4
add eax, DescriptorNull
mov [Base], eax
mov [Limit],WORD GlobalDescriptorTable - DescriptorNull - 1

lgdt [GlobalDescriptorTable]

mov eax, cr0
or eax, 1
mov eax, cr0

db 0xea ;Bitmuster für einen FAR JUMP
dw ProtectedMode
dw 0x8

[BITS 32]

ProtectedMode:

mov WORD [DescriptorCode+2], 0

mov WORD [DescriptorData+2], 0

mov BYTE [DescriptorCode+4], 0

mov BYTE [DescriptorData+4], 0



mov eax, 2

shl eax, 3



mov ds, ax

mov ss, ax

mov es, ax

mov eax, 0

mov fs, ax

mov gs, ax

mov esp, 0x1FFFFF



jmp 0x8:0x10000 + ProtectedMode2



ProtectedMode2:

mov eax, 0xb800
mov bh, 'p'
mov [eax], bh


Endless:
jmp Endless


TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #1 am: 15. November 2004, 00:58 »
Ist die Vidomemadresse nicht 0xB8000 ?
----------------------
Redakteur bei LowLevel

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 15. November 2004, 11:01 »
Achja, Tippfehler...aber sollte es nicht dennoch klappen? So ein 0 er hinten ist doch egal oder? Danke jedenfalls ich versuche es gleich mit dem extra 0er :)

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 15. November 2004, 12:03 »
Testergebnis: Negativ...
Es muss an etwas anderem liegen, aber gebootet wird correct, ich hatte vorher schon einen RM-Kernel damit laufen...

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #4 am: 15. November 2004, 14:36 »
Also erstmal isses relativ unsinnig mov eax,cs zu schreiben, cs=16Bit eax=32 Bit, das dürfte erstmal schon den Rechner erwirren^^
So und da du sowieso ne Exception erzwingst kanns nicht gehen^^
erst eax 0 setzten und dann fs und gs damit bestücken geht schief, da dies ein nicht gültiger selektor ist
des weiteren ist die Adresse wirklich  0xB8000
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 15. November 2004, 18:28 »
Logisch, danke ;)

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #6 am: 15. November 2004, 19:41 »
Immer gern^^
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 16. November 2004, 18:35 »
Strange...selbst wenn ich den Tut-Code 1:1 kopiere (egal ob aus PMode oder C-Kernel Tutorial) klappt es nicht...kann das an dem Pentium-S (100Mhz) liegen? Aber sowohl Win98 als auch FreeBSD (kA, welche Version...aber von 2003 also SEHR sicher PMode) laufen...

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 17. November 2004, 14:10 »
Ja, aber falls du den Cpp-Kernel-Thread unten meinst, dort wurde das Problem doch auch nicht gelöst, oder habe ich da was übersehen?

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 18. November 2004, 14:05 »
Dorthin kommt er bei mir auch nicht...

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 21. November 2004, 16:18 »
Kann es sein, dass man eine IDT erzeugen muss bevor man irgendwas machen kann?...ich fänd's strange...

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #11 am: 21. November 2004, 17:17 »
Solange du den Befehel LIDT nicht benutzt brauchst du auch keine IDT.

Nur die GDT muss vorhanden sein für den Sprung in den PMode.

Und ohne IDT sollten die Interrupts natürlich abgeschaltet sein.
----------------------
Redakteur bei LowLevel

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 21. November 2004, 18:25 »
Klar...hm...

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 22. November 2004, 16:40 »
Also ich habe noch eine Frage:

mov eax, cr0
or eax, 1
mov cr0, eax

diesen Teil sieht man immer wieder. Doch ist man da (zumindest beim 1. mov) noch im RM der nur 16Bit unterstützt und eax ist doch ein 32Bit Register oder? Naja, ich versuchte es mit ax statt eax doch dann sagte mir NASM bei den beiden beiden mov befehlen invaild combination of operator and operands...ich häng mal den ganzen Code ran (neu gecodet, jetzt nimmer nach TJ) bei dem machen sowohl Bochs als auch mein 2. Rechner 'nen Reboot...
kernel.asm:

org 0x1000

mov ah, 0
int 0x16

jmp GDT_End

GDT_Register:
dw GDT_End - GDT - 1
dw GDT

GDT:
GDT_Null equ $-GDT
dd 0x00000000
dd 0x00000000
GDT_Code equ $-GDT
dw 0xFFFF
dw 0x0000
db 0x00
db 0x9A
db 0xCF
db 0x00
GDT_Data equ $-GDT
dw 0xFFFF
dw 0x0000
db 0x00
db 0x92
db 0xCF
db 0x00
GDT_End:


cli

lgdt [GDT_Register]

mov ax, cr0
or ax, 1
mov cr0, ax

mov ax, GDT_Data
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
mov esp, 0x2FFFF

jmp 0x8:0x2000

kernel32.asm

org 0x2000
[bits 32]

Pmode:



Endless:
jmp Endless

GhostCoder

  • Beiträge: 187
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 22. November 2004, 16:55 »
Hiho,

Real und Protected Mode beziehen sich mehr auf Addressierung, anstatt auf Registergröße, die 32-Bit Versionen der meisten Register kannst du auch im RealMode aufrufen...


mov ax,cr0

klappt nicht, da cr0 32-Bit breit ist.

Man sieht, könnte man eax nicht im Real Mode benutzen, und da cr0 32-Bit groß ist, käme man nie in den PMode :)

MfG GhostCoder
A man, a legend!

GhostCoder

  • Beiträge: 187
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 22. November 2004, 17:04 »
Nochwas,



GDT_Register:
   dw   GDT_End - GDT - 1
   dw   GDT


da muss doch der zweite Wert ein DWORD (also dd) sein.
Außerdem muss der auch doch auch ne 32-Bit Addresse sein, nicht 16-Bit relativ zum codesegment.


xor eax,eax
mov ax,cs ; bzw. ds, kommt auf deinen vorherigen Code an...
shl eax,4
add ax,GDT_Null
mov dword [GDT_Register+2],eax


und den Code packst du nun vor lgdt [....], das sollte klappen.

MfG GhostCoder
A man, a legend!

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 22. November 2004, 18:08 »
Außerdem muss der auch doch auch ne 32-Bit Addresse sein, nicht 16-Bit relativ zum codesegment. <---Ähm...sorry, das habe ich nicht verstanden...was genau meinst du...

Danke, ich teste es gleich aber könntest du mal kurz erklären wofür der Code ist?

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 22. November 2004, 18:30 »
Funzt alles nicht...

GhostCoder

  • Beiträge: 187
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 22. November 2004, 19:17 »
Hiho,


   xor eax,eax
   mov ax,cs ; bzw. ds, kommt auf deinen vorherigen Code an...
   shl eax,4
   add ax,GDT_Null
   mov dword [GDT_Register+2],eax

der code wandelt eine RealMode Addresse (Segment:Offset) in eine lineare Addresse (Offset(32-Bit)) mittels addr=(Segment<<4)+Offset um. Den genau solch eine Addresse muss im gdt stehen.

Zitat

Außerdem muss der auch doch auch ne 32-Bit Addresse sein, nicht 16-Bit relativ zum codesegment. <---Ähm...sorry, das habe ich nicht verstanden...was genau meinst du...

Was ich oben gesagt habe, nicht Segment:Offset sondern nur 32-Bit Offset. Kannst dir das so vorstellen, das du 16 Segmente zu je 64kb hast (oder umgekehrt), daher ist der Offset relativ zum Segment...

Noch was, an welcher RMode Addresse liegt den der Kernel, und ist das Datensegment richtig gesetzt? Da du org benutzt, musst du wahrscheinlich noch nach dem "mov ax,ds" noch "add ax,0x1000" hinzufügen. Sonst sieht der Code eigentlich richtig aus. Btw, stimmen die Deskriptoren?

MfG GhostCoder
A man, a legend!

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #19 am: 22. November 2004, 20:57 »
hat man im PM eigendlich zugriff auf die ports?
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