[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