Autor Thema: Erkennen ob ein Programm beendet wurde.  (Gelesen 7951 mal)

gcalctool

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« am: 22. February 2010, 08:51 »
Hi Lowlevel-Community!

Mein Multitasking funktioniert so eigentlich einwandfrei! Ich kann die Programme starten die ich will. Jetzt stellt sich aber nur eine Frage! Wie erkenne ich ob ein Programm terminiert ist? Ich hab schon überlegt ob ich das irgendwie mit dem Stack lösen kann z.B. mein Stack ist (14*unsigned long) Bytes groß wenn ich das Programm starte. Da hab ich mir gedacht überprüfe ich doch einfach bei jedem mal wenn ich wieder im Kernel bin ist mein Stack (14*unsigned long) Bytes groß? Wenn ja hau ich das Programm aus dem Speicher. Ist dieser Gedanke zielführend oder gibt es da eine bessere/elegantere/sichere Lösung? Wie habt ihr das gemacht? meine Programme sehen zz. folgendermaßen aus:
#include <stdio.h>

void main() {
    printf("OS1 Testprogramm\n\n");
    while(1){}
}

Ich möchte aber dass es so funktioniert:
#include <stdio.h>

void main() {
    printf("OS1 Testprogramm\n\n");
    return;
}

Danke!

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
« Antwort #1 am: 22. February 2010, 09:13 »
Naja...
du hast ja bestimmt eine "Startup" Funktion geschrieben, die deine main-Funktion aufruft. Dort könnte man den Kernel dann per System Call anweisen, das Programm aus dem Speicher zu entfernen.
Bsp.:
.global _start
.extern main
_start:

# main aufrufen
call main
# kernel anweisen, das Programm zu beenden
movl $0,%eax
int $0x80

Das ist zumindest die Vorgehensweise, die ich für mein OS geplant habe...

gcalctool

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 22. February 2010, 09:18 »
Hi ChristianF!
Danke für deine Antwort aber mein Betriebssystem verwendet keine syscalls!

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 22. February 2010, 09:27 »
Dann gibt es noch eine andere Möglichkeit.
Du kannst eine Methode in deinem StartUp-Code aufrufen, die deinen Task aufräumt.
Danach könntest du gezielt auf den Kernel-Space zugreifen und damit für einen PageFault sorgen. Dann kann dein Kernel den Prozess beenden.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 22. February 2010, 09:40 »
Danke für deine Antwort aber mein Betriebssystem verwendet keine syscalls!
Und... wie funktioniert dein Betriebssystem dann? :|
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 22. February 2010, 09:58 »
Danach könntest du gezielt auf den Kernel-Space zugreifen und damit für einen PageFault sorgen. Dann kann dein Kernel den Prozess beenden.
Das wäre eigentlich auch ein Syscall, nur mit etwas ungewöhnlicherem Aufrufmechanismus.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

gcalctool

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 22. February 2010, 10:02 »
Danke für deine Antwort aber mein Betriebssystem verwendet keine syscalls!
Und... wie funktioniert dein Betriebssystem dann? :|

Es geht so dass ich einen Speicherbereich habe auf den alle Programme (inkl Kernel) zugreifen können in diesem Speicherbereich befindet sich eine Queue in dieser kommt alles rein was ein Programm will textausgabe texteingabe floppyzugriff usw der Kernel verarbeitet diese anfragen und stellt diese dann dem Programm eben in diesem Speicherbereich wieder zur Verfügung.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #7 am: 22. February 2010, 10:11 »
Und warum schreibst du dann da nicht am Ende rein, dass das Programm gerne vom Kernel beendet werden möchte? :?

Abgesehen davon wird das OS so wie du es baust ganz toll effizient (wegen Polling) und ganz sicher werden. :|
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

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 22. February 2010, 10:22 »
Was hast du denn da für eine Queue?
Was passiert, wenn die Liste voll ist? schmeißt du dann einfach das erste element wieder weg?
Dann könnten ein paar Messages verloren gehen.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

gcalctool

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 22. February 2010, 10:33 »
Hmm ja ich ich muss es wohl eh so machen dass ich das auch in die queue reinschreibe!

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 22. February 2010, 10:40 »
Dann brauchst du aber wieder Syscalls.
Ansonsten funktioniert das auch nicht.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #11 am: 22. February 2010, 10:40 »
Die andere Sache ist: Wie soll die Mutual Exclusion beim Zugriff auf die Queue funktionieren? Ich mein es geht ja nicht, dass zwei exakt gleichzeitig was reinschreiben (es sei denn du kriegst das mit atomaren Operationen gebacken).
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

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 24. February 2010, 21:43 »
Hallo,


Es geht so dass ich einen Speicherbereich habe auf den alle Programme (inkl Kernel) zugreifen können in diesem Speicherbereich befindet sich eine Queue in dieser kommt alles rein was ein Programm will textausgabe texteingabe floppyzugriff usw der Kernel verarbeitet diese anfragen und stellt diese dann dem Programm eben in diesem Speicherbereich wieder zur Verfügung.
Würdest Du das Bitte etwas näher erläutern.
Die üblichen, gut ausgetrampelten, Pfade kenne ich bereits, Du scheinst da eine andere Idee zu verfolgen. Ich bin einfach mal neugierig.
Aus Deiner knappen Ausführung heraus stelle ich mir das momentan irgendwie merkwürdig vor aber bestimmt hat Deine Idee auch gute Seiten.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

 

Einloggen