Autor Thema: Kann kein ProtectedMode  (Gelesen 3002 mal)

FlorianN

  • Beiträge: 50
    • Profil anzeigen
Gespeichert
« am: 29. October 2012, 19:50 »
Mit diesem Code komm ich nicht in den ProtectedMode:

;;;  Ein kleines Beispiel, wie man in den 32-Bit Protected Mode wechselt
;;;  Bei Fragen kann man sich einfach an die ICQ-Nummer 338-417-614 wenden.
 
[BITS 16]
org 0x0000 ; Addiert zu allen Offsets die Start-Adresse dieses Codes
 
cli ; Interrupts ausschalten
lgdt [gdtr] ; GDT Pointer laden
 
mov eax,cr0 ; In PMode wechseln, indem das niedrigste
or al,1 ; Steuerungsbit von cr0 geändert wird
mov cr0,eax ; muss über Umweg über ein 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
 
jmp $ ; Endlosschleife, wird durch weiteren Code ersetzt
 
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; == GDT == ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
gdtr: ; Desktiptortabelle
   dw gdt_end-gdt-1 ; Limit
   dd gdt ; Basisadresse
gdt:
   dd 0,0 ; Null-Deskriptor
codesel equ $-gdt
   dw 0xFFFF ; Segmentgrösse 0..15
   dw 0x0000 ; Segmentadresse 0..15
   db 0x00 ; Segmentadresse 16..23
   db 0x9A ; Zugriffsberechtigung und Typ
   db 0xCF ; Zusatzinformationen und Segmentgrösse 16...19
   db 0x00 ; Segmentadresse 24..31
datasel equ $-gdt
   dw 0xFFFF ; Segmentgrösse 0..15
   dw 0x0000 ; Segmentadresse 0..15
   db 0x00 ; Segmentadresse 16..23
   db 0x92 ; Zugriffsberechtigung und Typ
   db 0xCF ; Zusatzinformationen und Segmentgrösse 16...19
   db 0x00 ; Segmentadresse 24..31
gdt_end:

Ich benutze NASM. Ich habe diesen Code 1:1 (weil ich zu faul war  :-() aus dem Netz (http://www.lowlevel.eu/wiki/Umschalten_in_Protected_Mode) kopiert. Mein NASM macht keine Probleme. Beim Start funktioniert alles. Sobalt ich aber die Funktion "call PMode" aufrufe passiert nichts mehr!


Danke, Florian
Woher ich das weiß? Keine Ahnung.

ErstFreundlichDannBoese

  • Beiträge: 1
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 29. October 2012, 20:27 »
Hallo!
Ich denke, dass wir alle anfangs Probleme mit NASM, oder Assemblern allgemein hatten. Keine Sorge, das geht vorbei.

Aber das ist wohl ein Scherz, oder? Hast du dir eigentlich auch nur ein einziges mal den Code da oben auch nur halb durchgelesen? Da steht dick und fett, was wo alles passiert. Und auch, warum dein "call PMode" nicht funktioniert.

Svenska

  • Beiträge: 1 784
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 29. October 2012, 21:41 »
(a) Ich hatte dir anderweitig schon geschrieben, dass Abschreiben böse ist.
(b) Wir empfehlen jedem, keinen eigenen Bootloader zu schreiben und stattdessen den Multiboot-Standard zu verwenden. Gründe siehe in den unzähligen Threads hier im Forum.

FlorianN

  • Beiträge: 50
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 30. October 2012, 09:40 »
Verstehe ich etwas nicht? Muss der Code in den Bootloader? Bei mir stand er im Kernel! Ist Multiboot den zwingend?
Könnte es an der Dauerschleife liegen? Die habe ich später auch gelöscht. Es hat trotzdem nicht funktioniert.

(a) Ich hatte dir anderweitig schon geschrieben, dass Abschreiben böse ist.
Da hast du eindeutig Recht. Ich werde es lassen.

MfG Florian
Woher ich das weiß? Keine Ahnung.

Svenska

  • Beiträge: 1 784
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 30. October 2012, 10:30 »
Hallo,

das BIOS garantiert dem Kernel eine bestimmte Umgebung: Real Mode, Einsprungpunkt linear 0x7c000, usw. Das heißt, du musst den Protected Mode selbst aktivieren. Der Multiboot-Standard garantiert dir eine andere Umgebung: 32-Bit Protected Mode, Flat Memory, einen Einsprungpunkt nach Wahl, auf Wunsch auch einen grafischen Framebuffer. Wenn du die Umgebung nicht kennst und Code ausführst, der nicht dafür vorgesehen ist, dann macht die CPU natürlich komische Dinge (im Extremfall einen Reset).

Multiboot ist nicht zwingend, wird aber von uns sehr empfohlen. Gute Multiboot-fähige Bootloader sind GRUB/GRUB2 oder die Syslinux-Suite. Qemu kann Multiboot-Kernel auch direkt laden, womit man sich Images für den Anfang sparen kann.

Gruß,
Svenska

FlorianN

  • Beiträge: 50
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 30. October 2012, 11:31 »
Dann ist GRUB doch ein Programm, welches einen Bootloader darstellt und darauf den Kernel ausführt? Und wie ist das dann mir einen richtigem PC? Da gibt es doch kein GRUB.


Danke, Florian
Woher ich das weiß? Keine Ahnung.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 30. October 2012, 13:08 »
Ja, GRUB ist ein Bootloader, und den gibt es auf einem echten Rechner genauso wie im Emulator genau dann, wenn man ihn installiert hat...
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Svenska

  • Beiträge: 1 784
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 30. October 2012, 18:02 »
Da du keinen GRUB installiert zu haben scheinst, ist dein PC Windows-only. Dein Bootloader heißt dann NTLDR (XP) oder BOOTMGR (Vista/7). Beide können kein Multiboot. Nahezu jede Linux-Distribution installiert einen GRUB, um sich selbst zu starten...

Der Bootloader ist übrigens kein OS, denn wenn der Kernel läuft, wird der Bootloader meist aus dem Speicher geworfen und nicht mehr benutzt - es gibt kein Zurück.

FlorianN

  • Beiträge: 50
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 30. October 2012, 20:29 »
Ich verwende immer für meine OS die VM von Oracle. Der Bootloader kommt nicht aus Windows.

Ja, GRUB ist ein Bootloader, und den gibt es auf einem echten Rechner genauso wie im Emulator genau dann, wenn man ihn installiert hat...
d.h. ich muss ihn mit meinem Kernel verknüpfen?

Was ist eigentlich "Multiboot"? Das heist doch etwas wie Mehrfaches Starten (grob Übersetzt)? Ist das fürs Multitasking?


MfG Florian
Woher ich das weiß? Keine Ahnung.

tiger717

  • Beiträge: 84
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 30. October 2012, 20:43 »
Wie wärs mit erstmal googlen und dann fragen? Lowlevel-Wiki

Svenska

  • Beiträge: 1 784
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 30. October 2012, 21:57 »
Ich verwende immer für meine OS die VM von Oracle.
Du darfst sie auch VirtualBox nennen. ;-)

Der Bootloader kommt nicht aus Windows.
Jedes Betriebssystem bringt einen Bootloader für den eigenen Kernel mit. Windows den NTLDR/BOOTMGR, Linux in der Regel GRUB. Ohne Betriebssystem ist logischerweise auch kein Bootloader installiert.

Ja, GRUB ist ein Bootloader, und den gibt es auf einem echten Rechner genauso wie im Emulator genau dann, wenn man ihn installiert hat...
d.h. ich muss ihn mit meinem Kernel verknüpfen?
Der Sinn eines Bootloaders ist, genau das zu vermeiden...

Was ist eigentlich "Multiboot"? Das heist doch etwas wie Mehrfaches Starten (grob Übersetzt)? Ist das fürs Multitasking?
Nein. Deine Frage bedeutet aber, dass dir viel Grundlagenwissen fehlt. Das kannst du z.B. kriegen, indem du das Wiki mal komplett durchliest - ich persönlich würde dir aber mal ein paar gute Bücher empfehlen.

Von Tanenbaum/Woodhull gibt es "Modern Operating Systems", von H.-P. Messmer das "PC-Hardwarebuch", beides sind sehr gute Grundlagen- und Nachschlagewerke. Gebraucht bei Amazon in älterer Auflage recht billig zu haben und zumindest letzteres sollte in größeren Bibliotheken (ziemlich sicher in FH-/Uni-Bibliotheken, je nach Bibo darf man die auch als Schüler nutzen!) zu haben sein.

Dann sind die meisten der Fragen, die du jetzt hast, beantwortet. Und wenn du dann wiederkommst, kriegst du ziemlich sicher weniger genervte Antworten. :-D

Gruß,
Svenska

tiger717

  • Beiträge: 84
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 30. October 2012, 22:14 »
Modern Operating Systems von Tanenbaum kann ich sehr empfehlen. Zwar sehr theoretisch, aber trotzdem sehr hilfreich!

FlorianN

  • Beiträge: 50
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 31. October 2012, 09:44 »
Gut, ich besorge es mir mal.
Woher ich das weiß? Keine Ahnung.

 

Einloggen