Autor Thema: PMode Wahnsinn  (Gelesen 19111 mal)

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« am: 16. October 2006, 19:55 »
Ich hab mir TeeJay's PMode tutorial durchgelesen, und danach Code erstellt. Ich hab ihn mit dem mitgelieferten Code verglichen und angeglichen.
Ich kriege nur noch 'Exception 13'.
Dann hab ich mit verschiedenen Artikeln/Tutorials von Bona Fide verglichen. Das selbe.
Schlußendlich habe ich TeeJay's Code compiliert, wie es angegeben war, und war sehr überrascht, dass das Ergebnis das selbe war.
Okay, bin ich nun einfach zu blöde? Sicher ist, dass ich kurz vorm Computer-aus-dem-Fenster-Schmeißen bin, weil's mich echt nervt.
Ich brauche Hilfe! Ich will doch bloß in den Protected Mode umschalten!!
TFYA

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 16. October 2006, 19:59 »
Ich meine über TeeJays Beispiele schon das ein oder andere Mal gehört zu haben, daß sie nicht ganz fehlerfrei sind. Am besten wird man dir aber helfen können, wenn du den Code postest, mit dem du es versucht hast.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #2 am: 16. October 2006, 20:03 »
Erstmal: Willkommen bei Lowlevel

Aber jetzt zu deinem Problem:
Hast du nach dem PM Change mindestens noch eine Endlosschleife, oder einen Kernel drin? Sonst laueft der Prozessor irgendwo ins Speichernirvana, was selten besonders gut kommt  :wink:

Mit welchen Befehlen kompilierst/linkst du denn deinen Kernel ?

Ansonsten wärs vielleich nicht schlecht, wenn dudeinen code mal zegen wuerdest.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 16. October 2006, 20:16 »
Oder du kannst es mit dem Codeschnipsel von stefan2005 probieren.
Ist glaub ich in der 4. Ausgabe des Magazins.
Das ist viel weniger kompliziert....

Eine grosse Fehlerquelle ist auch ein vergessenes "h" oder eine "0" vor einer Hexzahl.


Nooooooooooooos

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« Antwort #4 am: 16. October 2006, 23:57 »
Na ja, der Code is wirklich derjenige von TeeJay's Pmode Tutorial auf seiner Website. Außerdem hab ich den code für's A20 gate hinzugefügt.
Zum kompilieren hab ich Nasm 0.98 und GCC 4.1 unter Linux benutzt. Ein endlos-loop ist vorhanden. Und kompiliert had ich's wie auf der website gesagt (kann auch die makefile posten)

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« Antwort #5 am: 17. October 2006, 02:55 »
Hab mir jetzt DJGPP runtergeladen, selbes Ergebnis. Danach hab ich noch ein wenig geändert, hier und da, und nun tut sich ein neues problem auf: Bochs shreibt in seine Logfile, dass the PMode eingeschaltet ist, aber auch, das irgendwie von der Floppy gelesen wird, und alles angehaltend ist. Dass muss nun noch for dem C-Kernel sein, da die Bildschirmausgabe nix liefert... Das A20 ist es auch nicht, habs mal auskommentiert, das selbe. So hier der Code, das meiste ist einfach von TeeJay's page (is'n bisschen lang, sorry admins):
Kernel16.asm:
[BITS 16]
jmp start

NULL_Desc:
        dd 0
        dd 0

CODE_Desc:
        dw 0xFFFF
        dw 0
        db 0
        db 0x9A
        db 0xCF
        db 0

DATA_Desc:
        dw 0xFFFF
        dw 0
        db 0
        db 0x92
        db 0xCF
        db 0

gdt:
        Limit dw 0
        Base  dd 0

start:

        cli
        mov eax, cs
        mov ds, ax

        shl eax, 4
        mov [CODE_Desc+2], ax
        mov [DATA_Desc+2], ax

        shr eax, 16
        mov [CODE_Desc+4], al
        mov [DATA_Desc+4], al

        mov eax, cs
        shl eax, 4
        add eax, NULL_Desc
        mov [Base], eax
        mov [Limit], WORD gdt - NULL_Desc - 1

        lgdt [gdt]

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

        db 0xea
        dw PMODE
        dw 0x8

[BITS 32]

PMODE:
        jmp PMODE

        mov word [CODE_Desc+2],0
        mov word [DATA_Desc+2],0
        mov byte [CODE_Desc+4],0
        mov byte [DATA_Desc+4],0

        mov eax, 2
        shl eax, 3
        mov ds, ax
        mov es, ax
        mov ss, ax
        mov eax, 0
        mov fs, ax
        mov gs, ax
        mov esp, 0x1FFFFF

        jmp 0x8:0x10000 + PMODE2

PMODE2:

A20:

.1:
        in al, 0x64
        test al, 00000010b
        jnz .1

        mov al, 0xD0
        out 0x64, al

.2:
        in al, 0x64
        test al, 00000001b
        jz .2

        in al, 0x60
        or al, 00000010b
        push eax

.3:
        in al, 0x64
        test al, 00000010b
        jnz .3

        mov al,0xD1
        out 0x64, al

.4:
        in al, 0x64
        test al, 00000010b
        jnz .4

        pop eax
        out 0x60, al

jmp END

times 512-($-$$) db 0

END:
Kernel32.asm:
[BITS 32]

        extern _main
        global start
start:
        call _main

stop:
        jmp stop
main.c:
unsigned char *VID_MEM = (unsigned char*)0xB8000;

int main()
{
        VID_MEM[0] = 'S';
        VID_MEM[1] = 0x1B;
        return 0;
}

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #6 am: 17. October 2006, 07:36 »
Zitat
PMODE:
        jmp PMODE
Kommt er denn bis zu dieser Endlosschleife?

bitmaster
In the Future everyone will need OS-64!!!

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« Antwort #7 am: 17. October 2006, 19:16 »
Hab die jetzt entfernt (danke, hab ich nicht gesehen), aber er bleibt wohl jetzt beim jump zum PMODE2 stehen. Bochs sagt, CS is 0x8 und EAX is 0x0, also glaub ich, dass es dort ist... Bin im PMode, hab CS und SS bei 32 bit... weiß nicht, wo's jetzt hakt...

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 17. October 2006, 22:17 »
Probiers mal mit dem PM Codeschnipsel der Ausgabe 7. Die ist nich so kompliziert und beinhaltet viel weniger Fehlerquellen.

Nooooooooooos

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« Antwort #9 am: 17. October 2006, 23:34 »
Ummm... würde ich ja gerne... aber... ich weiß nicht, irgendwie hat sich die Seite doch stark verändert in den letzten stunden...  :?

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 18. October 2006, 08:39 »
Schon?? Nimm einfach das:
;;;  Ein kleines Beispiel, wie man in den 32-Bit Protected Mode wechselt
;;;  Bei Fragen kann man sich einfach an stefan.marcik@web.de oder
;;;  an die ICQ-Nummer 338417614 wenden.

[BITS 16]
...
...
cli ; Interrupts ausschalten
lgdt [gdtr] ; GDT Pointer laden

mov eax,cr0 ; In PMode wechseln, indem das niedrigste
or al,1 ; Steuerungsbit von cr0 ge�ert wird
mov cr0,eax ; muss �mweg �in anderes Register gemacht werden

jmp codesel:PMode ; FarJump zu einer 32-Bit PMode Funktion

[BITS 32]
PMode:
mov ax,datasel ; Segmentregister laden
mov ds,ax
mov ss,ax
mov esp,0x90000 ; Stack aufsetzen
...
...

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; == GDT == ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

gdtr: ; Desktiptortabelle
   dw gdt_end-gdt-1 ; Limit
   dd gdt ; Basisadresse
gdt:
   dd 0,0 ; Null-Deskriptor
codesel equ $-gdt
   dw 0xFFFF ; Segmentgr�0..15
   dw 0x0000 ; Segmentadresse 0..15
   db 0x00 ; Segmentadresse 16..23
   db 0x9A ; Zugriffsberechtigung und Typ
   db 0xCF ; Zusatzinformationen und Segmentgr�16...19
   db 0x00 ; Segmentadresse 24..31
datasel equ $-gdt
   dw 0xFFFF ; Segmentgr�0..15
   dw 0x0000 ; Segmentadresse 0..15
   db 0x00 ; Segmentadresse 16..23
   db 0x92 ; Zugriffsberechtigung und Typ
   db 0xCF ; Zusatzinformationen und Segmentgr�16...19
   db 0x00 ; Segmentadresse 24..31
gdt_end


Noooooooooooooooos

__OS_coder

  • Beiträge: 69
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 18. October 2006, 17:34 »
Ich würd' für die Selectors lieber
 codesel equ (1<<3)
 datasel equ (2<<3)
schreiben.

Dann bist du auf der sicheren Seite... denn ein Selector ist
NICHT das Offset des Deskriptors in der GDT!!
Sondern der Index des Deskriptors bei 0 beginnend.
Dieser Eindruck entsteht bloß, da der Index um 3 Bits
linksverschoben ist.

;)

frizzz

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 19. October 2006, 00:00 »
Langer Rede kurzer Sinn - schaut auf meine homepage:
www.rcfriz.de
und findet auf alle Fragen,die Ihr habt, komplette Antworten.
Mein dort veröffentlichtes FDOS1 enthält fertig ausgetesteten, also fehlerfreien Code und ist ein kleines OS, das man sehr einfach selbst erweitern kann mit Prozeduren, die man unter einen Funktionskopf legen kann. Es ist in jedem Detail ausführlich kommentiert. Ausserdem habe ich deutsche Dokumentation beigepackt.
Wer höher hinaus will als nur bis zum pmode, kann sich in mein ASMOS vertiefen, das - so weit ich blicken kann -, wirklich neu und sehr fortgeschritten im Ausbau ist.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 19. October 2006, 09:47 »
Meins ist aber noch neuer und fortgeschrittener und einfach vieeeel besser als Windwos^^

Aber grad alles kopieren solltest du aber doch nicht, denn dann lernst du nix.

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« Antwort #14 am: 19. October 2006, 15:02 »
Na ja, tolle Werbung  :-P

FDOS is zwar 'gut' dokumentiert... aber ich hab trotzdem nicht durchgesehen, zumal die Herangehensweise an den PMode sehr anders ist.
Das Windows Hauptfeature had mein OS ja schon.... es funzt nicht  :wink:

Jetzt hab ich wieder Exception 13...

Hier der Code... Ich bin übrigens kurz vorm aufgeben...
[BITS 16]

start:
cli

xor ax, ax
mov ds, ax

lgdt [gdtr]

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

jmp codesel:PMODE

[BITS 32]

PMODE:
mov ax, datasel
mov ds, ax
mov es, ax
mov ss, ax
mov esp, 0x90000
xor ax, ax
mov fs, ax
mov gs, ax

A20:

.1:
in al, 0x64
test al, 00000010b
jnz .1

mov al, 0xD0
out 0x64, al

.2:
in al, 0x64
test al, 00000001b
jz .2

in al, 0x60
or al, 00000010b
push eax

.3:
in al, 0x64
test al, 00000010b
jnz .3

mov al,0xD1
out 0x64, al

.4:
in al, 0x64
test al, 00000010b
jnz .4

pop eax
out 0x60, al

jmp END

gdtr:
dw gdt_end-gdt-1
dd gdt

gdt:
dd 0
dd 0

codesel equ (1<<3)
dw 0xFFFF
dw 0
db 0
db 0x9A
db 0xCF
db 0

datasel equ (2<<3)
dw 0xFFFF
dw 0
db 0
db 0x92
db 0xCF
db 0
gdt_end:

times 256-($-$$) db 0

END:

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 19. October 2006, 17:16 »
Hast du vieleicht deinen Bootloader und dien Makefile auch noch???
An dem hier kann es einfach kaum liegen....

Noooooooooooos

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 19. October 2006, 18:50 »
also der code funzt bei mir mit ein paar kelien erweiterungen
[ORG 0x7c00]       ; als boot disk getestet

... der Code ...

times 510-($-$$) db 0
dw 0xaa55                     ; Boot Signatur (für boot disk)
times 1474560-($-$$) db 0
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« Antwort #17 am: 19. October 2006, 19:07 »
Der Bootloader is TeeJay's FAT12 bootloader, mit der einen einzigen Veränderung, dass er nach Kernel.sys und nicht Kernel.bin sucht... Mir fällt gerade auf... müsste ds dann nicht auf das segment 0x1000 zeigen...? Ocer muss ich [ORG 0x10000] einfügen oder so was?

__OS_coder

  • Beiträge: 69
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 19. October 2006, 19:21 »
Vllt liegt der Fehler in deinem Code, wie du da oben schon vermutest, in
der Segmentadresse des Datensegmentes. Du setzt die nämlich auf
0x0000

xor ax, ax
mov ds, ax

Die setz mal auf 0x1000, wenn der Bootloader den Kernel nach 0x10000 lädt.
Sonst findet er den GDT Pointer nämlich nicht. Denn der liegt ja dann an:
0x1000:_gdtr


FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« Antwort #19 am: 19. October 2006, 20:37 »
Okay, es funktioniert immer noch nicht... Ich frage mich so langsam echt, wieso es immer bei anderen funktioniert, aber bei mir nicht.
Es geht nicht, und ich sollte es dabei belassen. Danke für die Versuche mir zu helfen.

 

Einloggen