Autor Thema: Console in C  (Gelesen 6468 mal)

ReduX

  • Beiträge: 19
    • Profil anzeigen
Gespeichert
« am: 30. June 2007, 04:14 »
Hi,
Ich habe nun schon ein wenig rumprobiert und möchte mit einer Console in C vortführen!
Wie würdet ihr das machen?
Sollte ich da jetzt rießige switch blöcke erstellen oder gibt es eine bessere Alternative?

MFG ReduX

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 am: 30. June 2007, 10:03 »
Ein shell implementiert normalerweise nicht die gesamten Befehle, sondern nur die notwendigen sprachlichen Konstrukte (zB. Pipes, if-abfragen, schleifen, etc.). Die eigentliche Funktionalität (zB. ps, ls, etc.) wird von anderen Programmen übernommen.
Oder für was hättest du einen switch Block gebraucht?
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

ReduX

  • Beiträge: 19
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 30. June 2007, 11:29 »
Hi,
Also mit switch hätt eich gedacht z.b.:
switch(eingabe)
case"dir":
Files auflisten
break;
usw.
Hab damit nochnicht so die erfahrung, mein aktueller stand ist ich botte und lade den C-Kernel ca. so wie im C-Kernel Tutorial.

MFG ReduX

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #3 am: 30. June 2007, 11:32 »
Wenn man noch keine Möglichkeit hat Dateien von einem Medium zu laden (aufgrund von fehlendem Disketten/Festplatten/CD/Dateisystem-Treiber) dann ist das sicher eine Übergangslösung, aber danach würd ich das wie oben beschrieben machen.
btw. dein Code wird so nicht funktionieren. Du musst mit strcmp/strncmp die Zeichenketten vergleichen, man kann das so nicht einfach in ein switch/case packen.
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

ReduX

  • Beiträge: 19
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 30. June 2007, 13:18 »
Hi,
Also wie bereits gesagt bin ich auf dem stand wie im Tut C-Kernel.
So wenn ich nun als Dateisystem ext2 integriere kann ich ja dann deine Methoda anwenden oder? Oder brauch ich noch Festplattendreiber,CDTreiber?
Weil eigentlich kann ich ja dann mit dateien umgehen wenn ich ein FS habe!
Wie sieht das dann genau aus? etw. so?:
Tastatureingabe
if schleife
programm starten
rückgabe ausgeben
Nur wie funktioniert das mit den Programmen in Win mache ich beim Compilen .exe Files aber wie soll ich es da machen, also ich schreib mein Programm und dann compile ich es und hab dann ne .obj muss ich diese dann wie im TUT mit den anderen zusammen linken? Eigentlich ja nicht!
Oder hat es dann ein bestimmtes Format ähnlich wie bei Linux wo ich dann einfach über ne Funktion starten kann?

MFG ReduX

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #5 am: 30. June 2007, 13:29 »
Also erstmal würde ich dir empfehlen, Programmieren zu lernen. Damit mein ich jetzt nicht nur "hello world!". Das soll jetzt keine Beleidigung von mir sein, aber wer ein if als Schleife bezeichnet, hat noch was nicht begriffen...
Und bevor man ein OS in einer Programmiersprache schreibt, sollte man diese Sprache zuerst einigermassen beherrschen.

[edit] @Topic:
Ein Dateisystem-Treiber alleine bringt garnichts. Irgendwo muss der ja die Daten herkriegen.

Zum laden der Programme: Diese werden natürlich nicht mit dem Kernel zusammen gelinkt, sondern als eigenständige Programme.

Und was du mit
Zitat
Oder hat es dann ein bestimmtes Format ähnlich wie bei Linux wo ich dann einfach über ne Funktion starten kann?
meinst, ist mir nicht ganz klar.
« Letzte Änderung: 30. June 2007, 13:37 von FreakyPenguin »

ReduX

  • Beiträge: 19
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 30. June 2007, 14:41 »
Hi,
Ja ich weiß das if auch keine Schleife ist!
Was ich nochnicht kann ist asm bin aber drann!
Bin heute nur en bissel daneben!
Also wegen dem Linux Format meine ich:
Wie soll ich das exteren Programm compilieren? Kenne mich mit FS nochnicht so aus! Soll ich wie den Kernel eine .bin erstellen, kann ich diese dann mit dem FS irgendwie später aufrufen?
Hoffe es ist so verständlich.

MFG ReduX

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #7 am: 30. June 2007, 14:48 »
Kenne mich mit FS nochnicht so aus! Soll ich wie den Kernel eine .bin erstellen, kann ich diese dann mit dem FS irgendwie später aufrufen?

Also ich vermute mal, du meinst nicht Dateiesystem (denn damit hat das überhaupt nix zu tun) sondern Binär-Format oder wie man das auch immer nennen will. Für den Anfang reicht eine Flache Binary schon aus, ich würde dir aber trotzdem empfehlen von Anfang an ein "richtiges" Binär-Format zu benutzen, wie beispielsweise ELF oder PE. Wie diese Formate genau funktionieren, findest du in den entsprechenden Spezifikationen.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #8 am: 30. June 2007, 14:48 »
Wie soll ich das exteren Programm compilieren? Kenne mich mit FS nochnicht so aus! Soll ich wie den Kernel eine .bin erstellen, kann ich diese dann mit dem FS irgendwie später aufrufen?
Das Dateiformat deiner ausführbaren Dateien hat nichts mit dem Dateisystem zu tun. Das Dateisystem ist nur dafür zuständig aus den Sektoren einer Diskette/Festplatte/CD/DVD eine Datei- und Ordnerstruktur zu machen.
.bin kann man zwar zu Testzwecken als Format wählen, aber später wäre eines mit ein paar tolleren Features (Relocations, Zugriffsrechte auf Pages, Symbole, überhaupt mal nen Einsprungpunkt für die Datei) angebracht, also zB PE oder elf. Dein Programm linkst du normalerweise gegen deine selbst geschriebene libc. Die sorgt dafür das die main() Funktion aufgerufen wird und stellt auch die standard C funktionen speziell für dein OS zur verfügung.
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

Termite

  • Beiträge: 239
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 02. July 2007, 13:26 »
Moin

die intern implementieren Kommandos würd ich in Funktionen auslagern, damit das Programm übersichtlich bleibt. Und ob die hauptschliefe ein IF {} else if{} gebilde wird, oder ob sich ggf eine schönere übersichtlicher lösung findet würde bei mir von der anzahl der internen Kommandos abhängen.

Bei bis zu 10 würd ich noch zu if else greifen.

Darüber würde ich mir eine Liste aus den Befehlen und den Funktionspointern zusammenbauen, in inerhalb dieser Liste das entsprechende Kommando suchen, und dann einfach den funktionspointer aufrufen.

ggf liese sich da dann sogar noch etwas optimieren ( hash list, oder suchen in einer sortierten liste)

bei allen nicht internen Kommandos würde ich dann nach externen programmen suchen, und diese dann starten.

gruss

 

Einloggen