mxLader.c


/* mxLader.c */

#include "mxLader.h"
#include "mxStrukturen.h"
#include "mxKontrolle.h"
#include "mxProzess.h"
#include "mxCPUVerwaltung.h"
#include "mxKernStruk.h"
#include "mxMMU.h"
#include "mxAusgabe.h"
#include "mxTrap.h"
#include "mxLib.h"
#include "mxBenutzer.h"

/* -------------------------------------------------------------------------------------------------------------------- */

/**********************
** Globale Variablen **
**********************/

typedef struct {                                                        /* benoetigter Speicher eines Prozesses         */
  char UserStack[cUserStackGroesse];
  char KernStack[cKernStackGroesse];
} tProzessSpeicher;

tProzessSpeicher SpeicherTabelle[cMaximaleProzessAnzahl];

/* -------------------------------------------------------------------------------------------------------------------- */

/***************
** Funktionen **
***************/


void Freigeben(tProzessNummer ProzessNummer)
/*
 * Gibt die Resourcen eines Prozesses frei.
 */
{
                                                                        /* muss erst in spaeteren Stufen etwas tun      */
} /* Freigeben */

/* -------------------------------------------------------------------------------------------------------------------- */

tProzessNummer LadeProzess(tDateiName Kommando, tString ArgZeile)
{
  tProzessSpeicher         *PZS;
  tProzessVerwaltungsBlock *PVB;
  tProzessNummer           ProzessNummer;
  void                     *P;
  int                      i;

  for (i = 0; ProzessAufruf[i].Name[0]; i++) {                          /* Startadresse des angegebenen Prozesses       */
    if (!strcmp(ProzessAufruf[i].Name, Kommando)) break;                /* feststellen                                  */
  }
  P = ProzessAufruf[i].Routine;                                         /* P zeigt auf die Prozess-Routine              */
  if (!P) return 0;                                                     /* gibt's nicht -> zurueck                      */

  ProzessNummer = ProzessAnmelden();
  PZS = &SpeicherTabelle[ProzessNummer];
  PVB = &ProzessTabelle[ProzessNummer];

  if (ProzessNummer != 0) {                                             /* kann noch ein Prozess gestartet werden ?     */
    PVB->Speicher.UserStack        = &PZS->UserStack;                   /* vom Prozess belegten Speicher                */
    PVB->Speicher.UserStackGroesse = cUserStackGroesse;                 /*   im PVB vermerken                           */
    PVB->Speicher.KernStack        = &PZS->KernStack;
    PVB->Speicher.KernStackGroesse = cKernStackGroesse;

    ProzessStarten(ProzessNummer,                                       /* Prozess loslaufen lassen                     */
		   PZS->KernStack + cKernStackGroesse,                  /* erstes int ueberm Kernkeller                 */
		   PZS->UserStack + cUserStackGroesse,                  /* erstes int ueberm Benutzerkeller             */
		   P, cBenutzerZeit, Kommando, ArgZeile);
  }
  return(ProzessNummer);                                                /* neue Prozessnummer (bzw. 0) zurueckgeben     */
} /* LadeProzess */

/* -------------------------------------------------------------------------------------------------------------------- */

void EntferneProzess(tProzessNummer ProzessNummer)
{
  int ok;

  if (ProzessNummer > 0)   {                                            /* alles, nur nicht den Kernprozess             */
    ProzesswechselUnterbinden();
    ok = BeendenVorbereiten(ProzessNummer);                             /* Termination vorbereiten                      */
    if (ok) {                                                           /* darf Termination ausgefuehrt werden ?        */
      if (ProzessNummer == LaufenderProzess()) {                        /*   ja -> bei Selbsttermination                */
        Freigeben(ProzessNummer);                                       /*         erst freigeben und                   */
        ProzessBeenden(ProzessNummer);                                  /*         dann beenden                         */
      } else {                                                          /*         sonst                                */
        ProzessBeenden(ProzessNummer);                                  /*         erst beenden und                     */
        Freigeben(ProzessNummer);                                       /*         dann freigeben                       */
      }
      ProzessAbmelden(ProzessNummer);                                   /*         schliesslich PVB wieder freigeben    */
    }
    ProzesswechselZulassen();
  }
} /* EntferneProzess */

/* -------------------------------------------------------------------------------------------------------------------- */

int InitLader(void)
{
  return TRUE;
}


Bei Problemen mit der Seite bitte eine Mail an Marek
Converted with C2HTML V0.669 by Iluvatar
Prozeßdatenverarbeitung