Autor Thema: Wieso rebootet bei diesem Code Bochs?  (Gelesen 20862 mal)

PMTheQuick

  • Beiträge: 23
    • Profil anzeigen
Gespeichert
« Antwort #20 am: 17. June 2007, 19:44 »
Es geht leider nicht  :-(
org 0x7C00

starter:

jmp 07c0h:main_entry

main_entry:
mov ax,cs
mov ds,ax
mov es,ax
cli
mov ss,ax
mov sp,9000h
sti

mov ah,02h
mov al,1
mov cl,2
mov ch,0
mov dl,0
mov dh,0
mov es,0x9000
mov bx,0x0
int 13h

times 510-($-$$) db 0 ;wichtig: Hier die Datei mit so vielen Bytes füllen, bis es genau 510 sind
dw 0aa55h ;Bootsignatur anhängen
kernel:

Meine Make.bat sagt:
DJGPP setzen...
---
Bootloader erzeugen...
bootsec.asm:22: error: invalid combination of opcode and operands
---
Kernel16 kompilieren...
---
Kernel32 kompilieren...
---
C-Kernel kompilieren...
---
Zusammenlinken
---
Mergen
Finished.
3 Files Merged.
608 Bytes copied.
---
Unnoetige Files loeschen...
---
Drücken Sie eine beliebige Taste . . .

Gruss
PMTheQuick ;)

EDIT1: Halt mal! Wenn ich es so brauche, ist doch alles limitiert auf 512 Bytes oder? Sollte ich doch besser FAT12-Bootloader nehmen? Versuchte den gerade, aber der gibt ein CS-Limit knurr nichts geht von diesem tut ^^  :roll:
EDIT2: Jetzt gibets kein CS-Limit mehr, dafür jetzt dies:
00001256750i[CPU0 ] WARNING: Encountered an unknown instruction (signalling illegal instruction)
00001256751i[CPU0 ] BxError: instruction with opcode=0xdf
00001256751i[CPU0 ] mod was c0, nnn was 7, rm was 7
Langsam blick ich echt nicht mehr durch...
« Letzte Änderung: 17. June 2007, 19:54 von PMTheQuick »
Alle Beiträge und aller Code:
© 2007 P. Mathis

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 17. June 2007, 19:51 »
nenein...dein bootloader ist scho gut...hehe ja ich hab vergessen ein segmentregister kann man ja gar nicht direkt laden...also mov ax,0x9000; mov cx,ax

Gruss

PMTheQuick

  • Beiträge: 23
    • Profil anzeigen
Gespeichert
« Antwort #22 am: 17. June 2007, 19:57 »
Ok. Verwende meinen Bootloader. Nur ^^ Jetzt ist das da:

00001292493i[CPU0 ] WARNING: Encountered an unknown instruction (signalling illegal instruction)
00001292494i[CPU0 ] BxError: instruction with opcode=0xde
00001292494i[CPU0 ] mod was c0, nnn was 3, rm was 6

Was heisst das schon wieder? Irgendwie gibets nur Errors ^^ Und hier steht nicht mal ne Adresse

Gruss
PMTheQuick ;)
Alle Beiträge und aller Code:
© 2007 P. Mathis

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #23 am: 17. June 2007, 20:05 »
Ich würde dir weiterhin zu grub raten ;-)

Nim am besten ein Image von LOST:
http://lost-os.ath.cx/nightly_builds/459/nightly.img

Darauf kannst du alle Dateien und Verzeichnisse bis auf "grub" löschen.
Danach brauchst du nur noch den 32-Bit teil von deinem Kernel. Im Linkerfile musst du danach die Adresse so anpassen, dass sie >=0x100000 (>=1mb) ist, und das Ausgabeformat auf elf32-i386 ändern. In deiner kernel32.asm musst du dann noch die Multibootsignatur einfügen. Aber bitte aufpassen, dass sie nicht ausgeführt wird ;-).
65 multiboot_header:
 66 align 4
 67   MULTIBOOT_MAGIC     equ 0x1BADB002
 68   MULTIBOOT_FLAGS     equ 0x03
 69   MULTIBOOT_CHECKSUM  equ -MULTIBOOT_MAGIC-MULTIBOOT_FLAGS
 70
 71   dd MULTIBOOT_MAGIC
 72   dd MULTIBOOT_FLAGS
 73   dd MULTIBOOT_CHECKSUM

Wenn du dann deinen gelinkten Kernel hast, kopierst du ihn auf die Diskette und passt grub/menu.lst an:
Zitat
1 timeout 1
 2 title QuickOS
 3 kernel kernel.bin

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #24 am: 17. June 2007, 20:09 »
Hmm...hast du denn den Jmp im Bootloader eingefügt?

PMTheQuick

  • Beiträge: 23
    • Profil anzeigen
Gespeichert
« Antwort #25 am: 17. June 2007, 20:15 »
@FreakyPenguin: Ja... Aber ich will es eigentlich so lassen ^^ Und mit Grub, naja, was meint ihr denn dazu? Was is besser? (Mit ihr mein ich die gesamte Community ;) ) Und wie öffnet man so eine .img?

@nooooooooos
Ja... Deinen neuen Code... Also nun:
org 0x7C00

starter:

jmp 07c0h:main_entry

main_entry:
mov ax,cs
mov ds,ax
mov es,ax
cli
mov ss,ax
mov sp,9000h
sti

mov ah,02h
mov al,1
mov cl,2
mov ch,0
mov dl,0
mov dh,0
mov ax,0x9000
mov cx,ax
mov bx,0x0
int 13h

times 510-($-$$) db 0 ;wichtig: Hier die Datei mit so vielen Bytes füllen, bis es genau 510 sind
dw 0aa55h ;Bootsignatur anhängen
kernel:

[OT]Kennst du deine vielen o's in deinem Nick auswendig? ^^ Ich nicht, muss ständig kopieren  :lol:

Gruss
PMTheQuick ;)
« Letzte Änderung: 17. June 2007, 20:29 von PMTheQuick »
Alle Beiträge und aller Code:
© 2007 P. Mathis

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #26 am: 17. June 2007, 20:46 »
Hehe naja ich schreib einfach was...

Nach dem int-Aufruf solltest du noch ein jmp 0x9000:0x0 hinmachen, damit zum Kernel gesprungen wird.

Da aber der Stack scho n auf 0x9000 ist musst du den noch unbedingt auf irgendwas anderes setzen...z.B. 0x20000

Hast du das  jmp 0x8:0x910000+PMODE schon im Kernel schon zum:  jmp 0x8:0x9000+PMODE geändert?


Gruss
Noooooooooos

PMTheQuick

  • Beiträge: 23
    • Profil anzeigen
Gespeichert
« Antwort #27 am: 18. June 2007, 16:21 »
Hab jetzt mal alles hinzugefügt. Mein aktueller Source is:

bootsec.asm
org 0x7C00

starter:

jmp 07c0h:main_entry

main_entry:
mov ax,cs
mov ds,ax
mov es,ax
cli
mov ss,ax
mov sp,9000h
sti

mov ah,02h
mov al,1
mov cl,2
mov ch,0
mov dl,0
mov dh,0
mov ax,0x9000
mov cs,ax
mov bx,0x0
int 13h
jmp 0x9000:0x0

times 510-($-$$) db 0 ;wichtig: Hier die Datei mit so vielen Bytes füllen, bis es genau 510 sind
dw 0aa55h ;Bootsignatur anhängen
kernel:

kernel16.asm
[BITS 16] ;16 Bit Code erstellen
jmp start ;GDT überspringen

NULL_Desc:
dd 0
dd 0

CODE_Desc:
dw 0xFFFF ;Segmentgröße Byte 0/1
dw 0 ;Segmentbasisadresse Byte 0/1
db 0 ;Segmentbasisadresse Byte 2
db 10011010b ;Zugriffsberechtigungen
db 11001111b ;Zusatz + Segmentgröße Bits 16 - 19
db 0 ;Segmentbasisadresse Byte 3


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

gdt:
Limit dw 0 ;Größe der GDT (wird später eingetragen)
Base dd 0 ;Adresse der GDT (wird später eingetragen)


start:

cli ;Interrupts ausschalten

mov eax, cs ;EAX auf derzeitiges Codesegment setzen
mov ds, ax ;DS auf Codesegment setzen

shl eax, 4 ;EAX mit 16 multiplizieren (Lineare Adresse
;des Codesegments errechnen)
mov [CODE_Desc+2], ax ;Lineare Adresse des Codesegmentes als
mov [DATA_Desc+2], ax ;Startadresse des Code- und Datendeskriptors
shr eax, 16 ;eintragen
mov [CODE_Desc+4], al
mov [DATA_Desc+4], al

mov eax, cs ;Startadresse der GDT errechnen
shl eax, 4
add eax, NULL_Desc

mov [Base], eax ;Startadresse der GDT eintragen
mov [Limit], WORD gdt - NULL_Desc -1 ;Größe der GDT errechnen und eintragen

lgdt [gdt] ;GDT laden

mov eax, cr0 ;In den Protected Mode schalten,
or eax, 1 ;indem Bit 0 des CR0 Registers auf 1
mov cr0, eax ;gesetzt wird

db 0xea ;FAR-JUMP zum Codesegment
dw PMODE
dw 0x8


[BITS 32] ;32 Bit Code erstellen

PMODE:
mov WORD [CODE_Desc+2], 0 ;Code Segmentstartaddresse auf 0 setzen
mov WORD [DATA_Desc+2], 0 ;Daten Segmentstartadresse auf 0 setzen
mov BYTE [CODE_Desc+4], 0 ;Code Segmentstartaddresse auf 0 setzen
mov BYTE [DATA_Desc+4], 0 ;Daten Segmentstartadresse auf 0 setzen

mov eax, 2 ;Selektor für das Datensegment erstellen
shl eax, 3

mov ds, ax ;Daten- Stack- und Extrasegment mit
mov ss, ax ;Datensegmentdeskriptor laden
mov es, ax
mov eax, 0 ;FS und GS mit Null-Deskriptor laden
mov fs, ax
mov gs, ax
mov esp, 0x1FFFFF ;Stack auf unterhalb der 2 MB Grenze setzen

jmp 0x8:0x09000 + PMODE2 ;Sprung in das "neue" Codesegment

PMODE2:
jmp END ;Zum Ende Springen

times 512-($-$$) db 0; ;Da der Linker sich nicht mit ungeraden
;Dateigrößen verträgt, wird diese Datei auf 512
;gepaddet.

END:

kernel32.asm
[Bits 32]
extern _main
global start
global _EnableA20Gate

start:

call _main

STOP:
jmp STOP

;#######################################################################

Macros.asm
;#######################################################
;Macros für den einfachen Zugriff auf die über den Stack übergebenen Parameter
;ACHTUNG! Diese Macros sind nur bei einem 16-Bit Stack korrekt!

%define Param1 bp+4
%define Param2 bp+6
%define Param3 bp+8
%define Param4 bp+10
%define Param5 bp+12

;#######################################################
;Macros für den einfachen Zugriff auf lokale Variablen innerhalb einer Funktion
;die auf dem Stack erstellt wurden
;ACHTUNG! Diese Macros sind nur bei einem 16-Bit Stack korrekt!

%define Var1 bp-2
%define Var2 bp-4
%define Var3 bp-6
%define Var4 bp-8
%define Var5 bp-10

;#######################################################

link.txt
OUTPUT_FORMAT("binary")
INPUT(kernel32.obj ckernel.obj)
ENTRY(start)
SECTIONS
{
  .text  0x200 : {
    code = .; _code = .; __code = .;
    *(.text)
    . = ALIGN(1);
  }
  .data  : {
    data = .; _data = .; __data = .;
    *(.data)
    . = ALIGN(1);
  }
  .bss  :
  {
    bss = .; _bss = .; __bss = .;
    *(.bss)
    . = ALIGN(1);
  }
  end = .; _end = .; __end = .;
}

Und das geht nicht  :x Bochs:
00001292493i[CPU0 ] WARNING: Encountered an unknown instruction (signalling illegal instruction)
00001292494i[CPU0 ] BxError: instruction with opcode=0xde
00001292494i[CPU0 ] mod was c0, nnn was 3, rm was 6

Wieso nur?

Gruss
PMTheQuick ;)
« Letzte Änderung: 18. June 2007, 16:33 von PMTheQuick »
Alle Beiträge und aller Code:
© 2007 P. Mathis

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #28 am: 18. June 2007, 16:27 »
Hehe weil du im Bootloader mov cX,ax statt mov cS,ax geschrieben hast...Dann seh ich noch, dass du jmp 0x8:0x9a000 + PMODE2 statt jmp 0x8:0x9000 + PMODE2 schreibst...

Gruss
Noooooooooos

PMTheQuick

  • Beiträge: 23
    • Profil anzeigen
Gespeichert
« Antwort #29 am: 18. June 2007, 16:34 »
Das a hatte ich aufsversehen reingeschrieben ^^ Jetzt hab ich beides oben verbessert. Aber Fehler ist weiterhin da :(

Gruss
PMTheQuick ;)

EDIT: Zu cx statt cs ^^
nenein...dein bootloader ist scho gut...hehe ja ich hab vergessen ein segmentregister kann man ja gar nicht direkt laden...also mov ax,0x9000; mov cx,ax

Gruss
Aber egal ^^ Jeder macht nen Fehler.  :wink: (Nur ich mache mehrere irgendwie  :roll: )
« Letzte Änderung: 18. June 2007, 16:36 von PMTheQuick »
Alle Beiträge und aller Code:
© 2007 P. Mathis

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #30 am: 18. June 2007, 16:43 »
Ok dann probier mal zu schauen ob der Code überhaupt bis zum Kernel kommt: Einfach dort mal ein JMP $ hinmachen. Wenn der Fehler nicht erscheint kommt er bis dahin...So kannst du schauen wo der Fehler auftritt...

Dann seh ich noch einen Fehler von Mir, bei jmp 0x8:0x9000 + PMODE2 muss dass 0x9000 eine Null mehr haben weil es hier physikalisch ist...


Gruss
Noooooooooos

PMTheQuick

  • Beiträge: 23
    • Profil anzeigen
Gespeichert
« Antwort #31 am: 18. June 2007, 16:47 »
org 0x7C00

starter:

jmp 07c0h:main_entry

main_entry:
mov ax,cs
mov ds,ax
mov es,ax
cli
mov ss,ax
mov sp,9000h
sti

mov ah,02h
mov al,1
mov cl,2
mov ch,0
mov dl,0
mov dh,0
mov ax,0x9000
mov cs,ax
mov bx,0x0
int 13h
jmp $
jmp 0x9000:0x0

times 510-($-$$) db 0 ;wichtig: Hier die Datei mit so vielen Bytes füllen, bis es genau 510 sind
dw 0aa55h ;Bootsignatur anhängen
kernel:

Ergibt weiterhin den selben Fehler... Auch nach kernel: ein jmp $ ergibt weiterhin den selben fehler.. :( Das 9000 zu 90000 habe ich verbessert ;)

Gruss
PMTheQuick :)
Alle Beiträge und aller Code:
© 2007 P. Mathis

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #32 am: 18. June 2007, 16:59 »
Aumann...ich bin jetzt dann ruhig...auch mov cs,ax im Bootloader stimmt nicht!!! Es muss "ES" sein....

Gruss
Noooooooooos

PMTheQuick

  • Beiträge: 23
    • Profil anzeigen
Gespeichert
« Antwort #33 am: 18. June 2007, 17:10 »
Und weiterhin:

org 0x7C00

starter:

jmp 07c0h:main_entry

main_entry:
mov ax,cs
mov ds,ax
mov es,ax
cli
mov ss,ax
mov sp,9000h
sti

mov ah,02h
mov al,1
mov cl,2
mov ch,0
mov dl,0
mov dh,0
mov ax,0x9000
mov es,ax
mov bx,0x0
int 13h
jmp 0x9000:0x0

times 510-($-$$) db 0 ;wichtig: Hier die Datei mit so vielen Bytes füllen, bis es genau 510 sind
dw 0aa55h ;Bootsignatur anhängen
kernel:

Und nein, sag ruhig weiter ^^ Auch wenn manchmal was nicht stimmt, du bist dafür da und hilfst mir auch gut ;)

Gruss
PMTheQuick :)
Alle Beiträge und aller Code:
© 2007 P. Mathis

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #34 am: 18. June 2007, 17:14 »
Geht der Code erst wieder, wenn du das jmp $ vor das jmp 0x9000:0x0 setzt?

Du darfst mich sonst auch gerne im MSN, IRQ ansprechen...das könnte noch ne weile dauern...

Gruss
Noooooooooos

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #35 am: 18. June 2007, 17:57 »
ich hab hier mal schnell alles überflogen. (und hoffe das ich nichts wichtiges übersehen hab) mir ist nur schon gleich am Anfang aufgefallen das im BootSector ein JMP kernel gefehlt hat

naja

jetzt ist das ja nicht mehr stand der Dinge und mir fällt auf

org 0x7c00
starter:
jmp [b]0x07c0[/b]: main_entry
main_entry

Das ORG legt aber doch die Basis des Offsets fest, die nur bei 0x7c00 liegt,
wenn das segment 0x00 benutzt wird.

es muss also entweder zu 0x0000: main_enry gejumped werden und das org beibehalten oder der jump beibehalten und dafür org 0x0000 benutzt werden
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

PMTheQuick

  • Beiträge: 23
    • Profil anzeigen
Gespeichert
« Antwort #36 am: 18. June 2007, 18:39 »
Ok. Ich bedanke mich hier mal bei dir M. Nemo, und ganz gross bei nooooooooos  :-) Das einzige Problem ist jetzt noch der C-Kernel, der nichts ausgibt ^^ 0xA8000,0xA0000 und 0xB000 geht nicht  :-( Welche Adresse ist das? Und nochmals viel viel mals Danke an nooooooooos mit seiner guten & netten Unterstützung in ICQ :)

Gruss
PMTheQuick :)
Alle Beiträge und aller Code:
© 2007 P. Mathis

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #37 am: 18. June 2007, 18:46 »
RM: 0xB800:0x000
PM Lineare Adresse: 0xb8000
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

PMTheQuick

  • Beiträge: 23
    • Profil anzeigen
Gespeichert
« Antwort #38 am: 18. June 2007, 18:55 »
Das geht leider auch nicht... Kommt nur Booting from Floppy ^^ Sonst nichts ^^ Is irgendetwas falsch?

Gruss
PMTheQuick ;)
Alle Beiträge und aller Code:
© 2007 P. Mathis

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #39 am: 19. June 2007, 02:16 »
Zum Code sage ich jetzt mal nichts, sondern zu den Disketten-Images.
Die sind ein sektorgenaues Abbild einer Diskette und enthalten somit alle Daten inklusive den Verwaltungsinformationen des Dateisystems.

VFD wurde dir ja schon gegeben, ich persönlich benutze WinImage (ist aber Shareware). Das ist jedenfalls sehr bequem und kann die Disketten beim Brennen gleich mitformatieren.

"Brennen" (also auf Disketten schreiben) tue ich die Images mit dem Linux-Tool dd , welches es auch für win32 gibt. Das ist jedenfalls schneller als WinImage, wenn die Diskette fehlerfrei ist und durch die variable Blockgröße auch anderweitig geeignet (ich erzeuge damit z.B. HDD-Images).

Mit TeeJays Bootloader habe ich noch nicht gearbeitet, aber gehört, dass er Fehler beinhaltet und nicht überall funktioniert. Grub mag ich persönlich nicht, aber das ist Ansichtssache. Nimm es trotzdem. :-)

Gruß,
Svenska

 

Einloggen