[SOS] Dupliquer une tâche ...

Cyril Dupuit cyrildupuit at hotmail.com
Sam 4 Mar 16:19:17 CET 2006


Bonjour,
J'aimerai faire un équivalent de fork(), mais en environnement mono 
processus.
Je suis parti dans l'idée de faire une fonction TaskDuplicate() qui permet 
de dupliquer la tâche courante.
Pour cela, j'ai fait une copie de la pile de la tâche courante dans la 
nouvelle tâche.
Lorsque j'exécute cette fonction, j'obtiens un défaut de page et je ne 
comprend pas pourquoi.
Le contexte micro est correcte, mais lorsque je sors de la fonction 
_sos_syscall3(), ce défaut de page apparaît.
Est-ce que quelqu'un peut m'aider à résoudre ce problème ?
Voici le code de la fonction :
TaskID_t SysTaskDuplicate()
{
        Task_t * pNewTask;
        Stack_t StackSize;
        UINT32_t Offset;
        Flags_t EFlags;
        Stack_t * pStack;

        TaskLock(EFlags);
        // Calcul de la taille mémoire nécessaire
        StackSize = pCurrentTask->StackSize;
        pStack = (Stack_t *)kmalloc(StackSize);
        if(pStack == NULL)
        {/* Mémoire insuffisante */
                TaskUnlock(EFlags);
                return 0;
        }

        pNewTask = TaskDescInit((char *)pStack, StackSize, 
pCurrentTask->Priority);
        if(pNewTask == NULL)
        {/* Mémoire insuffisante */
                TaskUnlock(EFlags);
                kfree(pStack);
                return 0;
        }
        //Copie de la pile de la tâche à dupliquer
        memcpy(pNewTask->pStackBottom, pCurrentTask->pStackBottom, 
StackSize);
        //Retrouver la position du contexte dans la pile de la nouvelle 
tâche
        Offset = (UINT32_t)pCurrentTask->pCtxt - 
(UINT32_t)pCurrentTask->pStackBottom;
        pNewTask->pCtxt = (CpuContext_t *)(Offset + 
(UINT32_t)pNewTask->pStackBottom);

        SetReady(pNewTask);//Rendre prête la tâche
        pNewTask->pCtxt->EFlags = (1 << 9); /* set IF bit */
        TaskUnlock(EFlags);
        return pNewTask->TaskId;
}

Si jamais je viens à stopper l'exécution de la tâche courante lors de la 
copie, je n'ai pas de défaut de page et la tâche fille fonctionne 
correctement. Mais si la tâche mère et la tâche fille tournent en même 
temps, j'ai le problème.

Merci d'avance.

Cyril




Plus d'informations sur la liste de diffusion Sos