next up previous contents
suivant: L'allocation de pages d'un monter: Multiprocess et gestion de précédent: Multiprocess et gestion de   Table des matières

Création d'un processus en mémoire

La création d'un processus passe par la création d'un répertoire des pages et d'une page d'indirection semblable à ttpage du kernel. Ces pages sont créées dans le kernel, dans la zone de mappage des tables de pages.

Pour réserver de la mémoire pour un processus, on va tout d'abord allouer les pages dont il a besoin pour son code, son stack, et éventuellement pour ses données. Puis ces zones mémoire seront partagées avec le kernel, qui va les mapper en 0xc0000000. Le kernel va ainsi pouvoir remplir ces zones directement. Puis le partage au niveau du kernel est libéré, et le processus peut alors s'executer.

La création de ces zones est effectuée par la fonction CreateMemProcess, qui prend un pointeur vers une structure MemProcess en paramètre.

typedef struct MemProc
{
  struct ProcIn
  {
    int NumProcess; // Le numéro du process que l'on va créer
    int NbCodePage; // Le nombre de pages à réserver pour le code
    void * CodeEntry; // L'adresse virtuelle où implanter les pages de code
    int NbDataPages; // Le nombre de pages à réserver pour les data
    void * DataEntry; // L'adresse virtuelle où implanter les data
    int NbStackPages; // Le nombre de pages à réserver pour la pile
    void * StackEntry; // L'adresse virtuelle où implanter la pile. Attention: la pile va vers le bas. C'est donc l'adressse supérieure
  } In;
  struct ProcOut
  {
    void * CodeEntry; // Adresse virtuelle du code dans l'espace kernel
    void * DataEntry; // Adresse virtuelle du data dans l'espace kernel
    void * StackEntry; // Adresse virtuelle du stack dans l'espace kernel
    unsigned long cr3; // cr3 du process
  } Out;
} MemProc;

L'appel à la fonction KernelNettoie permet de libérer les partages, et donc de créer un nouveau process.



2003-03-30