Autor Thema: Code som richtig?  (Gelesen 5099 mal)

Noobtotal

  • Beiträge: 54
    • Profil anzeigen
Gespeichert
« am: 01. February 2007, 21:16 »
Also, ich hab hier schon lang nix mehr geschrieben, weil keine Zeit für OS-Coding. Allerdings werde ich jetz bald wieder Zeit haben und auch einen Testrechner! :-o
Jetz hab ich mal schnelleinen Kernelzusammengefrickelt, der zumindest mal den Pmode einschaltet und sich dann aufhängt. Nur hab ich wie gesagt lang nix mehr gemacht und auch nochkeinen Testrecheneer. Daher wäre es sehr nett, wenn einer der Experten mal schnell prüft, ob der Code zumindestens in der Theorie, so richtig ist!

org 0x7C00
bits 16
jmp Start
GDT:
GDTSTRUC STRUC
Limit dw 24d
BaseAdr  dw ?
GDTSTRUC ENDS
Null_Deskriptor:
dw 0
dw 0
dw 0
dw 0
Code_Deskriptor:
Stack_Deskriptor:
gdt_adr GDTSTRUC ?
Start:
Adresse:
xor eax,eax
mov ax,seg Null_Deskriptor
shl eax,4
add ax,offset Null_Deskriptor
mov [gdt_adr.BaseAdr],eax

P Mode Einschalten:
LGDT gdt_adr
mov eax,cr0
or eax,1 ; setzt PE-Bit (Bit 0)
mov cr0,eax
db 0EAh
dw Protected_Mode
dw 1h
bits 32
Protected_Mode:
jmp Protected_Mode
Is nur das Grundgerüst, also last euch nicht stören, das da noch die Bootsektor Signatur und so weiter fehlen!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 01. February 2007, 21:26 »
Welchen abgefahrenen Assembler benutzt du denn da?

Du hast ds nicht initialisiert.
Diese Initialiserung von "gdt_adr" ist Unsinn, und geht auch zur Assemblierzeit. (Tipp: Überleg mal welchen Wert seg Null_Deskriptor hat.)
Beherrscht dein Assembler kein jmp segment:offset? (db 0eah, ... sieht nicht so gut aus ...)
Außerdem ist der Code Selektor 8 nicht 1.
« Letzte Änderung: 01. February 2007, 21:28 von PorkChicken »
Dieser Text wird unter jedem Beitrag angezeigt.

Noobtotal

  • Beiträge: 54
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 01. February 2007, 21:41 »
Jetz besser?
Ach übrigens, das da oben war ziemlicher Blödsinn. Ich verwende eh einen Bootloager der den Kernel nach 10000h fervrachtet und ds und soweiter initialisiert!

bits 16
jmp Start
GDT:
GDTSTRUC STRUC
Limit dw 24d
BaseAdr  dw 10000h+Null_Deskriptor
GDTSTRUC ENDS
Null_Deskriptor:
Code_Deskriptor:
Stack_Deskriptor:
gdt_adr GDTSTRUC ?
Start:
LGDT gdt_adr
mov eax,cr0
or eax,1 ; setzt PE-Bit (Bit 0)
mov cr0,eax
jmp 8h:Protected_Mode
bits 32
Protected_Mode:
jmp Protected_Mode

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 01. February 2007, 22:13 »
du solltest die interrupts ausschalten wenn du keine idt und keinen stack initalisiert hast.

PS: zum testen brauchst du nicht unbedingt eine testrechner, mir bochs geht das viel einfacher.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Noobtotal

  • Beiträge: 54
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 01. February 2007, 22:18 »
Nun, siehts schon besser aus !danke Jetzt werd ich den Code mal testen und das was nicht funktioniert posten!(Ist sehr wahrscheinlich)
bits 16
jmp Start
GDT:
GDTSTRUC STRUC
Limit dw 24d
BaseAdr  dw 10000h+Null_Deskriptor
GDTSTRUC ENDS
Null_Deskriptor:
Code_Deskriptor:
Stack_Deskriptor:
gdt_adr GDTSTRUC ?
Start:
cli
LGDT gdt_adr
mov eax,cr0
or eax,1 ; setzt PE-Bit (Bit 0)
mov cr0,eax
jmp 8h:Protected_Mode
bits 32
Protected_Mode:
jmp Protected_Mode

 

Einloggen