Autor Thema: binär Datei laden(Shell)  (Gelesen 6462 mal)

bankkind

  • Beiträge: 10
    • Profil anzeigen
    • NicBec
Gespeichert
« am: 20. June 2007, 10:33 »
Hallo, :-)
Ich habe einen kleinen bootloader geschrieben, dieser lädt ein kleinen kernel(siehe LowLevel Ausgabe 1 Beispiel)
In diesen miniKernel, habe ich eine kleine Shell eingebaut. Ich will es allerdings so haben, dass dieser kernel die Shell automatisch lädt. Ich also die Shell als selbstständiges Programm habe.

Ich benutze (noch) kein Dateisystem.

Wie lade ich nun die Shell? und später auch weitere Anwendungen?

Ich meine: wenn ich die adresse der Datei weiß kann ich diese dann mit jmp laden? Wie komme ich an die adresse der Datei?

Ich wäre über ein kleines Beispiel dankbar.

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #1 am: 20. June 2007, 10:54 »
Du musst erstmal wissen, wo die Datei ist (in welchen Sektoren).
Ohne Dateisystem wirst du das fest in den Kernel einprogrammieren müssen, oder eine 1-Sektor große Daten-Datei anlegen, die du einliest.
In der kann dann Größe und Positon der shell stehen. (womit du dann bereits ein minimales Dateisystem hättets ;) )

Wenn du weist, wo die Datei ist, kannst du den Ersten sektor laden, in der du Headerinformationen zum Programm speicherst.
u.a. An welcher Adresse die Datei geladen werden muss.

Dann einfach ein call auf diese adresse machen.
call deshalb, weil du die shell ja auch irgendwann wieder verlassen möchtest.

bankkind

  • Beiträge: 10
    • Profil anzeigen
    • NicBec
Gespeichert
« Antwort #2 am: 20. June 2007, 11:36 »
Du musst erstmal wissen, wo die Datei ist (in welchen Sektoren).
Ohne Dateisystem wirst du das fest in den Kernel einprogrammieren müssen, oder eine 1-Sektor große Daten-Datei anlegen, die du einliest.

Wie meinst du das? Wie soll ich diese Daten Datei anlegen? Wo soll ich diese ablegen und wie kann ich diese von meinem Kernel aus ansteuern?

Für ein richtiges Daeisystem ist es noch zu früh, denn ich muss mich erstmal in die Theorie einlesen!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #3 am: 20. June 2007, 12:20 »
Für ein richtiges Daeisystem ist es noch zu früh, denn ich muss mich erstmal in die Theorie einlesen!
Dann mach das lieber anstatt irgendeine Frickellösung zu produzieren und FAT12 ist jetzt nicht so schwer.

Programmierst du dein OS unter Windows oder unter Linux?
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

bankkind

  • Beiträge: 10
    • Profil anzeigen
    • NicBec
Gespeichert
« Antwort #4 am: 20. June 2007, 12:25 »
Für ein richtiges Daeisystem ist es noch zu früh, denn ich muss mich erstmal in die Theorie einlesen!
Dann mach das lieber anstatt irgendeine Frickellösung zu produzieren und FAT12 ist jetzt nicht so schwer.

Programmierst du dein OS unter Windows oder unter Linux?

Momentan arbeite ich mit Windows, habe aber auch alle Tools in meiner Linux Installation!

Naja wie gesagt, denn muss ich mich eben mal ransetzen und mich da einlesen. Ich dachte halt nur, das ich anwendungen auch einfach so, ohne FS laden könnte.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 20. June 2007, 12:27 »
Also entweder packst du die Shell direkt hinter den Kernel...Dann weisst du auf welchem Sektor sie beginnt...

Oder eben du legst an einem festen Platz (zum Beispiel auch hinter dem Kernel) eine Tabelle an, auf welcher du einträgst auf welchem Sektor der Diskette deine Shell beginnt. Diese Tabelle könnte etwa so aussehen: dd  'Shel'
dd 0x78
Für weitere Dateien machst du dann einfach wieder einen Eintrag von 64-Bit; 32 für den Namen und 32 für den Sektor (wie du das mit CHS und LBA löst ist eine andere Frage).

Dein Kernel muss einfach in dieser Tabelle nach dem Wort 'Shel' suchen und dannach im folgenden Eintrag den Sektor auslesen...

Du solltest der Datei an den Anfang noch einen kleinen Header stellen, welcher die Dateilänge in Sektoren angibt und die geforderte Startadresse des Codes (der Code ist ja für eine bst. Adresse kompliert [Stichwort: org] und wenn man ihn nicht dorthin lädt stimmen die Labels nicht). Dieser Header könnte etwa so aussehen:
dd 0x16
dd 0x80000
Das 1. DWord gibt die Länge also 22 an + das 2. dass der Code nach 0x80000 geladen werden muss.

Mit diesen Infos kannst du jetzt den int 0x13 füttern und nachher musst du nur noch nach 0x80004 springen (also das 2. DW + 4).


Gruss
Noooooooooooos

bankkind

  • Beiträge: 10
    • Profil anzeigen
    • NicBec
Gespeichert
« Antwort #6 am: 21. June 2007, 10:44 »
Hallo, nochmal...

Ich habe nun nioch ein Problem, diesmal mit der Shell. Da ich Text ja mit der Funktion 09h des Int 10h ausgebe. Muss ich ja den Cursor immer Manuell setzen. Bei normalem schreiben und Zeilenumbrüchen klappt das alles.

Aber wenn ich dir Zeile 24 vom Monitor erreiche dann gehts ja nicht weiter. Ich habe nun versucht dieses Problem mit der Funktion 06h(int 10h) zu lösen, aber dieser Befehl reagiert einfach nicht. Ich weiß nicht...aber ich habe auch ein Beispielprogramm unter Windows als .com geschrieben, auch hier funktioniert es nicht.

mov AL, 1
mov AH, 06h
int 10h

Desweiteren interessiert mich mit welchem ASCII-Ccode ich die Pfeiltasten und Funktionstasten ansteuern kann?

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 21. June 2007, 21:14 »
Hmm also der Interrupt ist ja zum verschieben von Fensterinhalt nach unten...und wie ich dich verstanden habe willst du einfach einen Zeilenumbruch machen?
Ich merk nicht wie das im Sinn hast mit diesem Interrupt zu lösen...

Zu Pfeilen und Funktionstasten: Die gibts in ASCII gar nicht, weil damit nur Zeichen und keine Tasten (das wäre Scancode) codiert wird.


Gruss
Noooooooooooos

bankkind

  • Beiträge: 10
    • Profil anzeigen
    • NicBec
Gespeichert
« Antwort #8 am: 22. June 2007, 09:33 »
Nein, das geht mit diesem interrupt, ich habe es nämlich in der Zwischenzeit selbst hingekriegt. Ist zwar noch ein wenig Buggy, aber es ist möglich.

zu den ASCII codes: Ich kann doch ENTER, Shift und bla damit auch ansteuern!

Wie funktioniert das mit diesen scancodes? Gibt es dafür irgendwelche Übersichten?

Ich fange aber wahrscheinlich nochmal komplett von vorne an, um dann evtl gleich im Protected Mode zu arbeiten... mal sehen.

 

Einloggen