[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