|
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