Page principale   Liste par ordre alphabétique   Liste des composants   Liste des fichiers   Composants   Déclarations  

lib_ksinu.h

Aller à la documentation de ce fichier.
00001 /**
00002  * @file lib_ksinu.h
00003  * Bibliotheque standard pour le projet KSInu. Definit des constantes, structures
00004  * et types pour gerer :
00005  * - la memoire principale et secondaire
00006  * - les processus
00007  */
00008 
00009 #ifndef LIB_KSINU_H
00010 #define LIB_KSINU_H
00011 
00012 #include <stdlib.h>
00013 #include <stdio.h>
00014 #include <sys/types.h>
00015 #include <sys/stat.h>
00016 #include <fcntl.h>
00017 #include <unistd.h>
00018 
00019 
00020 /***************************************************
00021  Definition de la memoire pour la machine virtuelle
00022 ***************************************************/
00023 
00024 // Definition de la memoire
00025 #define T_MOT 4                    // Taille en octets d'un mot
00026 #define NPP 16                     // Nb de pages physiques en memoire
00027 #define NMPPP 32                   // Nb max de mot dans une page
00028 #define NPPS 255                   // Nb de pages physiques dans le swap
00029 #define T_PAGE (NMPPP*T_MOT)       // Taille en octets d'une page
00030 #define T_MAX_TAMPON (NMPPP*T_MOT) // Taille max d'un tampon (en octet)
00031 
00032 // Type pour manipuler la memoire
00033 typedef unsigned char octet_t; // octet_t est un octet non signe
00034 typedef octet_t mot_t[T_MOT];  // mot_t represente un mot mem ie une instruction
00035 typedef mot_t page_t[NMPPP];   // page_t represente un page physique
00036 
00037 // Organisation de la zone memoire d'un processus (table des pages d'un processus)
00038 #define T_MAX_ZONES 8                  // Taille max (en mots) des zones de code, donnees et pile
00039 #define NUM_MOT_IN (T_MAX_ZONES*3)     // Num du mot pointant sur le tampon d'entree
00040 #define NUM_MOT_OUT (T_MAX_ZONES*3+2)  // Num du mot pointant sur le tampon de sortie
00041 #define NUM_MOT_ESP (T_MAX_ZONES*3+4)  // Num du mot contenant la hauteur de la pile
00042 #define SP_MAX (T_MAX_ZONES*NMPPP)     // Hauteur maximale de la pile
00043 #define NUM_MOT_PPID (T_MAX_ZONES*3+5) // Num du mot contenant le ppid du processus
00044 #define NO_PERE 0                      // ppid d'un processus orphelin (qui n'a pas de pere)
00045 #define NUM_MOT_EXIT (T_MAX_ZONES*3+6) // Num du mot contenant la valeur de retour du proc
00046 
00047 // Verrous
00048 #define F_UNLOCK 0
00049 #define F_LOCK 1
00050 
00051 // Variables globales simulant les memoires
00052 page_t mem[NPP]; // Tableau simulant la memoire principale (RAM)
00053 int swap_d;      // Descripteur du fichier simulant la memoire secondaire (swap)
00054 
00055 
00056 
00057 /***************************************************
00058  Definition pour la table des processus
00059 ***************************************************/
00060 
00061 // Constantes de la table des processus
00062 #define N_MAX_PROC (NMPPP-NPP/T_MOT-1) // Taille de la table des processus
00063 #define DEBUT_T_PAGES (N_MAX_PROC+1)   // Debut de la table des pages ds la page des meta-info
00064 #define DEBUT_T_PROC 1   // Debut de la table des processus ds la page des meta-info
00065 #define NUM_PAGE_META 0  // Numero de la page des meta-inof contenant notamment la table des processus
00066 #define NUM_PAGE_SWAP 1  // Num de la page mem contenant la 1ere page de la liste des pages swap libres
00067 #define PAGE_VIDE 0      // Indique que l'emplacement (numero de pp) dans la memoire est libre
00068 #define NO_MORE_PID 0    // Plus d'emplacement libre ds la table des proc
00069 #define NO_MORE_PAGE 0   // Plus de page physique libre en memoire
00070 #define NO_MORE_SWAP 255 // Plus de page physique libre ds le swap
00071 
00072 // Constantes indiquant le type de la page physique
00073 #define PP_RAM 1   // RAM
00074 #define PP_SWAP 2  // Swap
00075 #define PP_NULL 0  // Inutilise par le processus
00076 
00077 // Constantes indiquant l'etat du processus
00078 #define E_MORT 0      // Processus mort
00079 #define E_ELIGIBLE 1  // Processus eligible
00080 #define E_ZOMBI 2     // Processus zombi
00081 #define E_SUSP 3      // Processus suspendu
00082 #define E_ATT_FILS 4  // Processus attendant la mort d'un fils
00083 #define E_ATT_LECT 5  // Processus attendant de pouvoir lire son entree standard
00084 #define E_ATT_ECRIT 6 // Processus attendant de pouvoir ecrire sur sa sortie standard
00085 
00086 // Constantes indiquant l'etat du drapeau de saut conditionnel
00087 #define C_VRAI 1 // La condition est vraie
00088 #define C_FAUX 0 // La condition est fausse
00089 
00090 // Constantes indiquant l'etat d'un mot dans une page
00091 #define M_NU 0 // Mot non utilise (par ex ceux qui se trouvent apres le haut de la pile)
00092 #define M_UT 1 // Mot utilise
00093 
00094 
00095 
00096 /************************************************
00097  Definitions pour les signaux
00098 ************************************************/
00099 
00100 // Les signaux
00101 #define S_NULL 0   // Aucun signal
00102 #define S_KILL 1   // Arme fatale
00103 #define S_MEM 2    // Violation de memoire
00104 #define S_SUSP 4   // Suspension
00105 #define S_REP 8    // Reprise
00106 #define S_USR1 16  // Non definie 1
00107 #define S_USR2 32  // Non definie 2
00108 #define S_INSTI 64 // Instruction illegale
00109 
00110 // Macros associees aux signaux
00111 /// Vrai si aucun signal n'est attache au processus
00112 #define SIFUNSIG(octet) ((int)octet == S_NULL)
00113 /// Vrai si S_KILL est pendant
00114 #define SIFKILL(octet) ((octet & S_KILL) == S_KILL)
00115 /// Vrai si S_MEM est pendant
00116 #define SIFMEM(octet) ((octet & S_MEM) == S_MEM)
00117 /// Vrai si S_SUSP est pendant
00118 #define SIFSUSP(octet) ((octet & S_SUSP) == S_SUSP)
00119 /// Vrai si S_REP est pendant
00120 #define SIFREP(octet) ((octet & S_REP) == S_REP)
00121 /// Vrai si S_USR1 est pendant
00122 #define SIFUSR1(octet) ((octet & S_USR1) == S_USR1)
00123 /// Vrai si S_USR2 est pendant
00124 #define SIFUSR2(octet) ((octet & S_USR2) == S_USR2)
00125 /// Vrai si S_INSTI est pendant
00126 #define SIFINSTI(octet) ((octet & S_INSTI) == S_INSTI)
00127 
00128 /// Structure representant un signal intercepte
00129 typedef struct signal {
00130   int signal;          ///< Signal capture ou ignore
00131   int cp;              ///< Si capture : compteur programme du handler. Si ignore : S_IGNORE 
00132   struct signal *next; ///< Signal intercepte suivant
00133 } signal_t;
00134 
00135 /// Table de capture des signaux
00136 signal_t* table_capture[N_MAX_PROC];
00137 
00138 
00139 /************************************************
00140  Implementation d'une pile fifo
00141 ************************************************/
00142 
00143 /// Structure d'une cellule de la pile.
00144 struct cellule {
00145   // Champ propre a la cellule
00146   struct cellule *suivant; ///< Cellule suivante ds la pile.
00147   // Champs pour les processus
00148   int pid;                 ///< Numero du processus en cours d'execution
00149   int temps;               ///< Nb de fois consecutives que le proc a ete appele.
00150   // Champ pour les pages
00151   int page;                ///< Numero d'une page physique de la memoire principale
00152 };
00153 
00154 /// Le type pile fifo.
00155 typedef struct {
00156   struct cellule *tete;
00157 } l_fifo;
00158 
00159 
00160 /***************************************************
00161  Execution des processus
00162 ***************************************************/
00163 
00164 /// Nb d'instructions executees a la suite par un processus av de rendre la main a un autre proc
00165 int quantum;
00166 
00167 /// Ordonnancement des processus
00168 l_fifo* liste_proc;
00169 
00170 /// Gestion de la memoire principale (memorise les acces a chaque page)
00171 l_fifo* liste_pages;
00172 
00173 #endif

Généré le Sun Sep 29 22:47:22 2002 pour KSInu par doxygen1.2.16