[SOS] Pagination ?
Cyril Dupuit
cyrildupuit at hotmail.com
Dim 10 Oct 18:49:47 CEST 2004
Bonjour,
J'ai pas mal de question à vous poser. La plus importante concerne la
pagination. Elle va certainement vous paraître stupide, mais après plusieurs
lectures de votre article paru dans Linux mag n°65, je n'ai toujours pas
compris.
Je développe un noyau multitâche mono utilisateur en me servant des sources
de SOS.
Pour identifier un objet (Thread, sémaphore, etc...), j'utilise un
identificateur d'objet appelé ID. Cet identificateur découle de la création
de l'objet, c'est à dire que je me sers de son adresse de création pour
créer son identificateur.
Par exemple, si je crée un objet :
Object = (Object_t *)malloc(sizeof(Object_t));
L'identificateur obtenu sera alors son adresse sous forme d'entier long non
signé.
ID = (unsigned long) Object;
Lors de la vérification d'un objet, j'effectue l'opération suivante :
if(ID != Object->ID) return ERROR;
Ma question est la suivante :
Que se passe t-il lorsque l'objet sera transféré sur disque pour libérer la
mémoire centrale, puis réaffecté en mémoire centrale à une autre adresse
physique ?
La valeur d'ID ne correspondra plus avec le pointeur sur l'objet.
Question concernant le passage de paramètres :
J'ai voulu passer un paramètre à un thread pour que son point d'entré
ressemble à ceci :
void MonThread(unsigned long Param);
Pour cela, j'ai modifié l'initialisation de la pile du thread :
*pStack-- = (Stack_t)Param;//paramètre du thread
*pStack-- = (Stack_t)0;//paramètre non utilise
*pStack-- = 0x00000202; //EFLAGS avec les interruptions activées
*pStack-- = CS_SELECTOR; //Sélecteur de segment
*pStack-- = (Stack_t) pTaskDesc->pTask; //Point d'entré du thread
*pStack-- = 0;//Code d'erreur
*pStack-- = 0xBADCAFFE;// EBP
*pStack-- = 0xADDEDBED;// EDI
*pStack-- = 0xDEADBEEF;// ESI
*pStack-- = 0xDDDDDDDD;// EDX
*pStack-- = 0xCCCCCCCC;// ECX
*pStack-- = 0xBBBBBBBB;// EBX
*pStack-- = 0xAAAAAAAA;// EAX
*pStack-- = 0x00000010;// SS
*pStack-- = 0x00100010;// DS, ES
*pStack = 0x00100010;// FS, GS
pTaskDesc->pStack = pStack;
J'ai ajouté les deux premières lignes. L'exécution d'un thread commence
comme ceci :
leal CurrentTaskDesc, %edi /* Chargement dans edi de l'adresse de
CurrentTaskDesc */
movl (%edi), %eax /* eax = CurrentTaskDesc */
movl (%eax), %esp /* esp = CurrentTaskDesc->pStack => pile du thread*/
/* Charger le contexte de la tache */
popw %gs
popw %fs
popw %es
popw %ds
popw %ss
addl $2,%esp
popl %eax
popl %ebx
popl %ecx
popl %edx
popl %esi
popl %edi
popl %ebp
addl $4, %esp
iret
Avec l'initialisation de la pile présentée précédemment, le noyau fonctionne
correctement. Mais ce que je ne comprend pas, c'est pourquoi initialiser la
pile avec un paramètre inutilisé : *pStack-- = (Stack_t)0. Si je retire
*pStack-- = (Stack_t)0 le noyau plante (illegal opcode). Pourtant un thread
qui ne lit pas le paramètre Param ne plantera pas le noyau. ??!!!!!???
Merci d'avance.
Cyril.
_________________________________________________________________
Recevez par e-mail des émoticônes pour MSN Messenger
http://g.msn.fr/FR1001/2275?url=http://www.msn.fr/ilovemessenger/premium/Default.asp?Ath=f
Plus d'informations sur la liste de diffusion Sos