Autor Thema: Fragen zur Shell  (Gelesen 3941 mal)

Moritz31

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« am: 21. July 2013, 22:18 »
Hey,

Bin neu hier im Und im os entwickeln hab jetzt 3 Jahre mit c++ aufm Buckel und dachte mir mal was anderes als spiele wäre schön , so bin ich von c/asm in microkontrollern nun hier gelandet :)

Erstmal großes Lob an das Wiki und Vorallem die Einsteigerserie :D

Nun zu meiner frage, es geht um die Grundsätzliche Umsetzung der Shell Befehle.
Würde es sinnvoll sein die Befehle in einer Art Tabelle zu speichern und dann zu vergleichen oder wie würdet ihr die Befehle implementieren ? Ich will eine Shell ähnlich der von Linux machen also von den Befehlsnamen her :)

Mir würden schon links oder Vorschläge reichen :)

Hätte noch eine weitere frage die Shell würde ja dann als normales Programm (Ring 3) implementiert werden. Wenn ich nach der Einsteigerreihe gehe über grub als Modul reinladen. Wenn ich das ganze jetzt auf Harddisk/LiveCD speichern und Ausführung möchte müsste ich Treiber / Dateisysteme für Harddisk / CD implementieren oder?


MfG
Moritz31

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 21. July 2013, 23:30 »
Hallo und willkommen an Board!

Würde es sinnvoll sein die Befehle in einer Art Tabelle zu speichern und dann zu vergleichen oder wie würdet ihr die Befehle implementieren ?

Das ist auf jeden Fall eine sinnvolle Möglichkeit. Für manche Sachen wie cd, exit, set oder export ist das vermutlich auch die einzige Möglichkeit.

Unter Linux sind allerdings manche Sachen, die wie einfache Befehle aussehen, nicht in der Shell integriert sondern eigenständige Programme. Das bietet sich an, wenn die Komplexität der Befehle steigt, und man nicht den Code dafür in einem einzigen Programm haben will.

Wenn du in deiner Shell eine komplette Skriptsprache (if-Abfragen, Schleifen, etc.), dann musst du dafür einen Parser in der Shell implementieren.

Hätte noch eine weitere frage die Shell würde ja dann als normales Programm (Ring 3) implementiert werden. Wenn ich nach der Einsteigerreihe gehe über grub als Modul reinladen. Wenn ich das ganze jetzt auf Harddisk/LiveCD speichern und Ausführung möchte müsste ich Treiber / Dateisysteme für Harddisk / CD implementieren oder?

Wenn du auf der Festplatte oder der CD einen Multiboot-kompatiblen Bootloader hast, kannst du auch diese anweisen die Shell als Modul zu laden. Langfristig ist es aber sinnvoll die von der Festplatte zu laden und dafür brauchst du Treiber.
Dieser Text wird unter jedem Beitrag angezeigt.

Moritz31

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 21. July 2013, 23:50 »
Ok :) die Tabelle würde ich dann als 1 dimensionales Array implementieren , welches einfach überprüft ob der Befehl existiert, das könnte man ja dann noch erweitern zu einem 2 dimensionalen Array , wo in der 2. Dimension steht ob es sich um etwas externes handelt oder nicht, falls extern dieses aufrufen falls nicht die Anweisung suchen die für diesen Befehl ausgeführt werden soll.

Okay bei Dateisystem Fang ich am besten mal mit fat16 oder ext2 an :)

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 22. July 2013, 00:45 »
Ok :) die Tabelle würde ich dann als 1 dimensionales Array implementieren , welches einfach überprüft ob der Befehl existiert, das könnte man ja dann noch erweitern zu einem 2 dimensionalen Array , wo in der 2. Dimension steht ob es sich um etwas externes handelt oder nicht, falls extern dieses aufrufen falls nicht die Anweisung suchen die für diesen Befehl ausgeführt werden soll.

Extra Einträge für externe Programme sind nicht nötig. Deine Shell soll sicherlich auch Programme aufrufen können, die du nicht einprogrammiert hast. Die ausgelagerten Shell-Befehle solltest du auch wie ganz normale Programme aufrufen. Wenn der User was eingibt, das kein eingebauter Shellbefehl ist, dann wird einfach versucht ein Programm mit dem Namen zu finden.
Dieser Text wird unter jedem Beitrag angezeigt.

mineorbit

  • Beiträge: 55
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 22. July 2013, 16:24 »
Hallo schön das du zu diesem Wiki gefunden hast!
Hast du den bereits einen Treiber für die tastatur,  wenn ja kannst du mir bitte helfen?
Wegen der Shell, hätte ich für dich einen Anreiz. Du könntest ein txt dokument mit allen komandos und dann mit syscalls verbinden, wenn du einen speichertreiber hast, so hab ichs bisher gemacht.
Viele Grüße,
Mineorbit

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 23. July 2013, 03:27 »
Eine Textdatei, die bestimmte Befehle mit Syscalls verbindet, finde ich eher nicht gut. Befehle und Syscalls mappen sich nicht besonders gut aufeinander und es wird immer Befehle ohne direkte Syscalls (z.B. if/case) und Syscalls ohne direkte Befehle (z.B. FORK) geben. Außerdem ändert sich diese Liste nicht zur Laufzeit des Systems, es reicht also eine statische Zuordnung im Code - die ist eh schneller.

 

Einloggen