Autor Thema: PMode geht nicht  (Gelesen 13648 mal)

kotzkroete

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« am: 18. May 2007, 11:20 »
Hi,
ich bin seit ein paar Tagen dabei, mir ein betriebssystem zu schreiben. Aber ich schaffs nicht, in den PMode zu kommen.
org 0x7C00 ; right after some BIOS stuff

start:                   
cli             ; no interrupts
xor ax, ax
mov ds, ax      ; set ds
mov es, ax      ; and es
mov ax, 0x9000  ; this is our stack address
mov ss, ax     
mov sp, 0x400   ; its 512 bytes big
sti             ; allow interrupts
 
; save out bootdrive
mov [bootdrv], dl

; load the kernel
mov ax,0x1000      ; ES:BX = 0x10000
mov es,ax
mov bx, 0
call read_it
call kill_motor

;enter pmode
cli
; enable a20
call kbc
mov al,0xD1 ; write
out 0x64,al
call kbc
mov al,0xDF ; enable s20
out 0x60,al
call kbc
sti
; ok, this should be enabled...let's hope so

;lgdt [gdtr] ; load gdtr pointer

;mov eax,cr0 ; finally enter pmode
;or al,1
;mov cr0,eax

;jmp codesel:Pmode
;[BITS 32]
;Pmode:
;mov eax,datasel
;mov ds,eax
;mov ds,eax
;mov es,eax
;mov fs,eax
;mov gs,eax
;mov ss,eax
;mov esp,0x90000

mov si,loadmsg
putstr:     ; print a string
lodsb             ; load character
or al,al
jz short putstre  ; if 0 >> end of string
mov ah,0x0E       ; 0x0E
mov bx,0x0007     ; attribute
int 0x10          ; call the function
jmp putstr        ; next character
putstre:

; jump to the kernel
;jmp codesel:0x100000
mov ax, 0x1000 ; the address of our kernel
mov es, ax     ; update registers
mov ds, ax
push ax
mov ax, 0
push ax
retf

;--------------------------------------------
;--------------------------------------------

bootdrv db 0 ; bootdrive
loadmsg db "Loading the kernel...",13,10,0
 
; load the kernel (second sector)
read_it:
reset: ; floppydrive reset (Interrupt 13h, 0)
push ds            ; save ds
mov ax, 0          ; reset
mov dl, [bootdrv]  ; our bootdrive
int 13h           
pop ds             ; recover ds
jc reset          ; try again if it didn't work
; read sector
read_sec:
mov ah, 2       ; read
mov al, 5       ; read 5 sectors
mov ch, 0 ; cylinder = 0
mov cl, 2 ; sector = 2
mov dx, 0       ; head=0, drive=0
int 13h         
jc read_sec     ; try again if it didn't work
retn

kill_motor: ; turns off the floppy drive's motor
push dx
mov dx,0x3f2
mov al,0x0c
out dx, al
pop dx
ret

kbc:
xor al, al ; set al to 0
in al, 0x64 ; get kbd status through input port 0x64
test al, 2 ; check if second bit is clear
jnz  kbc
ret

; the GDT table
gdtr: ; desctiptortable
   dw gdt_end-gdt-1 ; Limit
   dd gdt ; baseaddress
gdt:
   dd 0,0 ; 0 descriptor
codesel equ $-gdt
   dw 0xFFFF ; segmentgoesse
   dw 0x0000 ; Segmentadresse 0..15
   db 0x00 ; Segmentadresse 16..23
   db 0x9A ; Zugriffsberechtigung und Typ
   db 0xCF ; Zusatzinformationen und Segmentgröße 16...19
   db 0x00 ; Segmentadresse 24..31
datasel equ $-gdt
   dw 0xFFFF ; segmentgroesse
   dw 0x0000 ; Segmentadresse 0..15
   db 0x00 ; Segmentadresse 16..23
   db 0x92 ; Zugriffsberechtigung und Typ
   db 0xCF ; Zusatzinformationen und Segmentgröße 16...19
   db 0x00 ; Segmentadresse 24..31
gdt_end

times 512-($-$$)-2 db 0   ; to make sure the first sector is full
dw 0AA55h                 ; Bootsignature

So siehts aus. Und so geht es auch, aber nur weil ich nicht in den pmode gehe.
Den Code hab ich fast 1:1 aus der Ausgabe 7 genommen. Aber irgendwie geht es nicht. Ich hab das Gefuehl, dass dann irgendwas mit den Adressen falsch ist, aber ich weiss nicht, was.

Kleine Anmerkung:
An einer Stelle geb ich einen String aus. Wenn ich in den Pmode gehe, dann wird der nur ausgegeben, wenn er nach dem code steht, wo ich das bootlaufwerk speichere. Sprich: bei ";load the kernel" muss er sich irgendwie aufhaengen. Aber wo denn? Und warum haengt er da nur, wenn ich spaeter ich den pmode wechsel? Das weiss er doch noch nicht an dieser Stelle.

Hm...ich hoffe mal, jemand kann mir helfen.

Edit: Also ich hab jetzt gemerkt, dass er nicht haengt sondern rebootet. Im qemu sah's halt anders aus. Hm....ich verstehs nicht.
« Letzte Änderung: 18. May 2007, 14:08 von kotzkroete »

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 18. May 2007, 11:41 »
Was den String betrifft: Du machst deine Textausgabe über int 10h. Das geht im PMode nicht, du mußt direkt in den Videospeicher schreiben (ab 0xB8000).
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

kotzkroete

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 18. May 2007, 11:47 »
Achso...ja...den PMode hab ich leider noch nicht so ganz verstanden....argh....
aber ist das dann der Grund, warum er einfach verreckt?

Leider schaff ich es auch nicht mir einen eigenen Interrupt zu bauen :/ Die code snippets in irgendeiner Ausgabe funktionieren naemlich nicht.

Edit: Wie macht denn eigentlich dann noch irgendwas, wenn man keine interrupts mehr benutzen kann? oder ist das nur der 0x10, der nicht mehr geht?

Edit2: Soll ich das mit dem Pmode nicht vielleicht einfach sein lassen? Das ist viel zu kompliziert.
« Letzte Änderung: 18. May 2007, 12:03 von kotzkroete »

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #3 am: 18. May 2007, 13:02 »
aber ist das dann der Grund, warum er einfach verreckt?
Jo, Interrupts ohne IDT führen zum Tripple Fault und das heißt reboot.

Zitat
Edit: Wie macht denn eigentlich dann noch irgendwas, wenn man keine interrupts mehr benutzen kann? oder ist das nur der 0x10, der nicht mehr geht?
Du musst selber direkt mit der Hardware "sprechen", zB bei 0xB8000 ist der VideoRAM (zumindest im Textmodues). Die meiste andere Hardware verbirgt sich aber hinter den I/O Adressen (ansprechbar über in/out).

Zitat
Edit2: Soll ich das mit dem Pmode nicht vielleicht einfach sein lassen? Das ist viel zu kompliziert.
Im realmode wirst du nicht viel Spaß haben.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

kotzkroete

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 18. May 2007, 13:10 »
Och noe....
Das muss aber auch kompliziert sein.

Zitat
Jo, Interrupts ohne IDT führen zum Tripple Fault und das heißt reboot.
Heisst das, dass ich mit IDT interrupts ausfuehren kann?

Zitat
Im realmode wirst du nicht viel Spaß haben.
Na aber im Pmode hab ich ja noch weniger Spass....

Korona

  • Beiträge: 94
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 18. May 2007, 13:12 »
Im 32Bit-PMode sehen die Instructions anders aus, daher kannst du im PM keinen 16-Bit Realmode Code mehr ausführen.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #6 am: 18. May 2007, 13:15 »
Zitat
Jo, Interrupts ohne IDT führen zum Tripple Fault und das heißt reboot.
Heisst das, dass ich mit IDT interrupts ausfuehren kann?
Ja, aber nicht deine heißgeliebten BIOS Interrupts. Das kannst du nur mit einer noch um einigeres komplexeren Lösung hinbekommen (virtual-8086-mode), aber glaub mir, das ist auch nicht wirklich wünschenswert.

Im realmode wirst du wegen der 640Kilobyte maximal benutzbaren RAMs keinen Spaß haben und weil du wenn du dann eh in den pmode wechselst nichts von deinem Code wiederverwenden kannst.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

kotzkroete

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 18. May 2007, 13:18 »
Aber so weiss ich ja nichtmal, wie ich ein Zeichen schreiben oder lesen kann...
schreiben weiss ich ein bisschen, aber lesen z.B. garnicht.
Und wie lese ich denn Daten vom floppy, wenn mir 0x13 fehlt? Muss ich das alles ueber in/out machen?

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 18. May 2007, 13:22 »
Aber so weiss ich ja nichtmal, wie ich ein Zeichen schreiben oder lesen kann...
schreiben weiss ich ein bisschen, aber lesen z.B. garnicht.
Mit einem Tastaturtreiber. ;)

Zitat
Und wie lese ich denn Daten vom floppy, wenn mir 0x13 fehlt? Muss ich das alles ueber in/out machen?
Genau, so ist es. Ein OS ist halt nichts, was man mal an einem Nachmittag kurz runterschreibt.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

kotzkroete

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 18. May 2007, 13:23 »
Argh....und muss ich das jetzt alles selber rausfinden, oder gibsts da vielleicht gewisse anlaufstellen?

Coffee

  • Beiträge: 470
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 18. May 2007, 13:29 »
*taljethzustimm*
aber es gibt genug tutorials, die das erklären...
kannst dich mal unter http://www.osdeveloper.net.tc/ anmelden  und dir das buch (kostenlos) zuschicken lassen (als pdf)

PS: sorry an alle, die den autor des buches "nicht mögen", aber es ist einfach gut gemacht^^

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 18. May 2007, 13:35 »
Ich habe nichts gegen Toaster, aber das Buch ist höchstens als Nachschlagewerk für die Tabellen geeignet, wenn man eh schon weiß, was man machen muß.

Ich würde dir empfehlen, GRUB zu benutzen, dann bist du das ganze Realmode-Zeug, das du später eh nicht mehr brauchst, schonmal los. Eine PMode-Textausgabefunktion wäre noch nützlich, bevor du dann erstmal eine Weile damit beschäftigt bist, eine funktionierende GDT und IDT aufzusetzen und einen Interrupt zu überleben. ;)

Bevor du Interrupts hast, macht alles andere keinen Sinn.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« Antwort #12 am: 18. May 2007, 13:37 »
Oder Geh mal auf http://www.osdever.net/, dort gibt es viele Tutorials, wenn auch in English. Zur Einführung würde ich dir Bran's Kernel Development Tutorial (http://www.osdever.net/bkerndev/index.php) raten, dort wird ein kleiner Kernel bis hin zur Tastatureingabe entwickelt und gut erklärt.

Und warum der PMode hier nicht funktioniert... Das Problem hatte ich mal. Also, zuerst würde ich dir raten, den PMode nach dem laden des Kernels an eine Speicherstelle einzuschalten, also eigentlich vor dem Sprung.
Dann musst du bedenken, dass du bei aktiviertem PMode im 32-Bit modus bist. Also muss ein Jmp auch eine physische Adresse erhalten.
Mit anderen Worten, nicht
        jmp Pmode
Pmode:

sondern:
        jmp dword Pmode
Pmode:

Der Thread sollte noch irgendwo sein, find den aber nicht mehr.

Auch will ich dir eher raten, GRUB zu benutzen, macht hier fast jeder, und es gibt noch andere Vorteile.

kotzkroete

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 18. May 2007, 13:51 »
Hm....aber die schreiben alle in C.
Eigentlich war mein Grund fuer die ganze Sachen mit Betriebssystemen, assembler zu lernen.
Dann muss ich ja ganz viel umdenken.
Naja...vielleicht ueberleg ich mir auch nochmal, ein OS zu programmieren. Der Pmode scheint mir etwas zu kompliziert zu sein.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #14 am: 18. May 2007, 14:07 »
Du kannst dein OS auch in Assembler schreiben, aber zum Assembler lernen ist imho ein OS nicht das richtige Projekt. Du wirst sehr schnell feststellen, das du mit Assembler nicht produktiv arbeiten kannst. Zumindest war es meine Erfahrung, dass ich ab X Assemblerzeilen keine Ahnung mehr hab wo überhaupt welche lokale Variable steckt und was in Register sein sollte... :roll: Aber wie gesagt, für einen Assemblerprofi - der in Assembler denkt - mag das eine triviale Aufgabe sein.
Vllt. wäre es auch für dich geschickter Anwendungssoftware oder Treiber für ein bestehendes OS zu schreiben.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

kotzkroete

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 18. May 2007, 14:12 »
Nee, nee...das mit den Betriebssystemen find ich jetzt toll...
Aber Frustration gehoert sehr dazu.
Ich braeuchte nur mal einen (einfachen) bootloader, der:
in den pmode geht
a20 enabled
und dann zum kernel springt
(und den ganzen Kram, den der bootloader sowieso koennen muss)

GRUB will ich nicht nehmen, weil ich von dem den code vermutlich nicht verstehen werde.

Da haeng ich momentan noch am meisten. Ich komm zwar in den Pmode (obwohl ich mir da auch nicht ganz  siche bin), aber dann komm ich nicht weiter. Ich hab keine Ahnung, wie ich dann zum Kernel komme.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #16 am: 18. May 2007, 14:35 »
GRUB will ich nicht nehmen, weil ich von dem den code vermutlich nicht verstehen werde.
Du musst den grub code nicht verstehen, es ist nämlich sehr genau festgelegt, was grub alles für dich macht und was nicht.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

kotzkroete

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 18. May 2007, 15:13 »
Ich will den aber verstehen. Ich will doch wissen, wie der Bootloader funktioniert. Leider bin ich wieder einer der einzigen die so denken.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #18 am: 18. May 2007, 15:21 »
Ich will den aber verstehen. Ich will doch wissen, wie der Bootloader funktioniert. Leider bin ich wieder einer der einzigen die so denken.
Hehe, ich progge mein OS-Loader auch selber. Da der meiner Meinung nach zum OS zählt (sowie die libs) und ich ein eigenes OS proggen möchte. *duck*

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

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #19 am: 18. May 2007, 15:35 »
Ich will den aber verstehen. Ich will doch wissen, wie der Bootloader funktioniert. Leider bin ich wieder einer der einzigen die so denken.
Ich wollte damit ja auch nur ausdrücken, dass das Verständnis jeder Codezeile und das Verständnis des Zusammenspiels der Codezeilen keine zwingende Voraussetzung zur Benutzung sind. Zum anderen wollte ich dir die sinnlose Folter eines eigenen Bootloaders ersparen. Ich mein dann hast du einen der auf Dateisystem XY und Datenträger Z funktioniert, aber sonst auch nirgendwo, klasse :wink:

bitmasters post ignoriere ich einfach mal, sonst würde das wiedermal in einen Flamewar ausarten. Aber mit solchen Kommentaren die grade dazu auffordern kannst du dich nie zurückhalten oder wie bitmaster?
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

 

Einloggen