Autor Thema: Bootloader  (Gelesen 7170 mal)

jeb

  • Beiträge: 341
    • Profil anzeigen
    • http://www.jebdev.net
Gespeichert
« am: 23. July 2005, 17:05 »
Mal so ne kleine Frage. Ich habe mir gerade überlegt, wie ich am besten den Bootloader mache, aber auf einer FAT12 formatierten Diskette. Alle sagen, dass man immer alles in die 512 Bytes reinquetschen muss. Aber warum? Man kann doch einfach RsvdSecCnt auf 2 setzten. Dann hat man schon 1KB frei und ein anders OS sollte die Diskette trotzdem noch laden können (bei Win gehts). Gibt es einen grossen Nachteil dass ich diesen Trick noch nirgends gesehen hab?

maumo

  • Beiträge: 182
    • Profil anzeigen
    • http://maumo.50webs.com/
Gespeichert
« Antwort #1 am: 23. July 2005, 17:48 »
das problem ist das beim booten nur der erste sektor geladen wird und der ist 512byte groß. du könntest in den ersten sektor code schreiben der dann die restlichen läd, die wiederum dateien von der diskette laden können.

maumo

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #2 am: 23. July 2005, 17:50 »
Jo,

Das geht nicht. ;)

Das, was geladen wird, ist nicht per FAT12 beeinflussbar. Das ist garnicht beeinflussbar. Das ist Hardwareebene und auf der ist das konstant immer der erste Sektor. Die Hardware kennt keine Sachen, wie FSs!

Du hast 2 Möglichkeiten:
 :arrow: Es auf 512 Bytes bringen, was in Assembler nicht so schwer sein dürfte.
 :arrow: Stages verwenden, im Bootloader was weiß ich wie viele Sektoren nachladen (die du mit deinem Trick "freigeschaltet" hast ;)) und dann das als ganzer Bootloader verwenden, womit du das OS lädst.

J!N

EDIT: Too late. ;)
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

jeb

  • Beiträge: 341
    • Profil anzeigen
    • http://www.jebdev.net
Gespeichert
« Antwort #3 am: 23. July 2005, 19:37 »
Das der Prozessor nur einen Sektor lädt, war mir klar. Das wollte ich gar nicht wissen. Ich meinte bloss, dass man Daten an einer immer gleich bleibenden Stelle im Speicher laden kann. Ich also eine genaue Adresse angeben kann, von wo aus der Rest geladen werden soll. Ich wollte nur wissen ob an der Methode, mehrere reservierte Sektoren für den Bootloader ein Nachteil ist, da dies nirgends beschriben ist. Das war mein Problem.

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #4 am: 23. July 2005, 20:14 »
Nö ein Nachteil ist das nicht. Es gibt einige Bootloader die diesen Trick benutzen. Roshls zum Beispiel und glaube GRUB auch. in 512 Byte kann man eben wirklich nur das aller nötigste unterbringen.

Deinen "Trick" solltest du also getrost anwenden können. Du solltest es dann einfacherweise so aufteilen, das der Bootloader, der vom BIOS geladen wird (also die ersten 512 bytes) Code enthalten, welcher dann deinen eigentlichen Bootloader, der in den folgenden Sektoren untergebracht ist, läd und diesen ausführt. So würde ich es machen....aber es steht dir natürlich frei es zu machen wie du magst :)
----------------------
Redakteur bei LowLevel

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #5 am: 23. July 2005, 20:14 »
Ich weiß nicht, ob ich dann noch von einem Bootloader reden würde, sobald er über mehrere Sektoren geht. Wenn du das machst, dann würde ich es klar in Stages unterteilen. Dann ist es besser strukturiert, als irgendein Kuddelmuddel.
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

jeb

  • Beiträge: 341
    • Profil anzeigen
    • http://www.jebdev.net
Gespeichert
« Antwort #6 am: 23. July 2005, 21:55 »
stages?
Ich habe bemerkt, dass weder mein Pentium 2 noch der AMD 1800+ XP die Strings anzeigt, die vom Bootsektor ausgegeben werden (also Speicherstelle 7c00). Jedoch werden die Strings an Speicherstelle 0x1000 ohne Probleme dargestellt. Ich frage mich jetzt, wohin ich mein stage2 laden soll. Der Kernel kommt vielleicht an 0x1000, dann wäre das wohl nicht sogut für den Bootloader. Wohin soll der (damit Strings angezeigt werden).

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 24. July 2005, 01:18 »
ich vermute, du hast deine segmentregister falsch geladen. überprüfe mal ob du vielleicht die segmentregister mit 0x7C0 geladen hast und gleichzeitig org 0x7C00 am anfang stehen hast, oder die segmentregister mit 0 geladen sind und auch org 0 zu beginn hast. in beiden fällen wird der string, der irgendwie ausgegeben werden soll, von der falschen adresse gelesen. das hatte ich schon paar mal ... äh .. ich mein: das hatte ich schon paar mal bei einigen anderen bootsektoren gesehen. ;)
Dieser Text wird unter jedem Beitrag angezeigt.

jeb

  • Beiträge: 341
    • Profil anzeigen
    • http://www.jebdev.net
Gespeichert
« Antwort #8 am: 24. July 2005, 01:49 »
ok. Aber jetzt habe ich ein anderes Problem:
Ich möchte, dass der User den Pfad zum Kernel Angibt. Dazu habe ich folgenden code:

path: db "                                                                         ",0
pathcnt db 0x00
prompt db "kernel>",0
kerror db "Kernel could not be found.",13,10,0

;Der Loader ruft shell auf:
shell:
mov si,prompt
call print
call userinput
kernel_error:
mov si,kerror
call print
jmp shell
retn

userinput:
mov [pathcnt],0
letterwait:
mov ah,0x00
int 0x16
cmp al,13 ;wenn ENTER
je return
mov [path+[pathcnt]],al
add [pathcnt],1
jmp letterwait
return:
mov [path+[pathcnt]],0
call load_kernel

load_kernel:
jmp kernel_error


Alles was der User eingibt wird in die Variable "path" gespeichert. Deshalb hab ich auch einen Counter (pathcnt). Nach jedem Zeichen wird diesr Counter um eins erhöht. Nun muss ich das Zeichen ja auch in die Paht-variable speichern (mov [paht+[pathcnt]],al), doch genau da meckert er, die Adresse sei zu ungenau. Ich habe auch schon Sachen wie : mov [path+ db [pathcnt]],al versucht doch ohne erfolg.

Hat jemand eine Idee oder bereits selbst eine Shell programmiert?

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #9 am: 24. July 2005, 09:12 »
Hi,

Ich hab schonmal ne Shell in LowOS gemacht. Im Assembler gehen jegliche Adressierungen über Variablen nicht. Das musst du mit Registern machen. Anderst geht es nicht. Und auch bei Registern gehen nur ein paar (SI,DI,BX). Du musst also die beiden Adressen in SI und BX laden und dann das an Stelle der Werte hinschreiben.

J!N
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

jeb

  • Beiträge: 341
    • Profil anzeigen
    • http://www.jebdev.net
Gespeichert
« Antwort #10 am: 24. July 2005, 11:07 »
wunderbar, es funktioniert.

 

Einloggen