[SOS] problème de pile

David Decotigny david.decotigny at free.fr
Lun 5 Déc 15:53:27 CET 2005


Bonjour,


draconux wrote:
> comment passer des paramètres à la fonction cmain en utilisant le
> bootloader bootsect.s (dossier extras) ?

On passe deja des parametres a sos_main depuis le bootsectur :

	pushl %eax  /* valeur de addr */
	pushl $0x42244224 /* valeur de magic pour indiquer qu'on a
                             poussé
	                     la taille de la RAM sur la pile */
	pushl $0 /* normalement call fait un push eip,
                    mais la on a un jmp*/
	
	/* Saut vers le noyau. La GDT est en place (flat mode), les
 	 * selecteurs aussi, a20 est ouverte, et les interruptions sont
	 * cli + pas de idt. Le PIC n'est pas programme */
	ljmp $0x8, $sos_main

C'est-a dire qu'on passe 2 parametres : un magic pour indiquer que la
taille de la RAM (fournie par le BIOS) est passee par la pile, et la
taille de la RAM justement. Ensuite on fait un jmp pour faire semblant
d'avoir ete appeles par un call situe a l'adresse 0 : c'est pour ca
qu'on empile 0 avant le jmp.

Pour passer un autre parm sur la pile, voir le patch en attachement : on
veut passer 0x505caffe depuis le bootsect et l'obtenir en tant que 3eme
argument de sos_main. La copie d'ecran presente le resultat.

> dans bootsect.s je fait :
>     pushl $20
>     ljmp $0x8, $sos_main
> 
> dans main.c fonction sos_main
> 
>    asm volatile( "popl %%eax;  \
>                          movl %%eax,%0;"
>                          :"=r" (magic)
>                          :\
>                          :"%eax");

Et oui mais non. Parce que quand main demarre, il y a plein de choses
qui sont allouees sur la pile. Par exemple chez moi j'ai un beau :
  20d073:       83 ec 28                sub    $0x28,%esp
Donc c'est normal que si on fait ta manip au debut de main, on lise a
peu pres n'importe quoi. Pour lire la bonne valeur il faudrait tenir
compte de la taille allouee dans la pile. Et ca c'est pas la bonne
methode : ca depend du compilo, de la ou tu te situes dans la fonction, etc.

La bonne solution est d'utiliser simplement les arguments de ta fonction
(cf patch). Si tu ne sais pas a l'avance combien d'args seront empiles,
tu peux utiliser le mecanisme va_start/va_end (variadiques) detaille
dans un des premiers articles de la serie.

Bonne journee,

-- 
David Decotigny -- http://david.decotigny.free.fr
-------------- section suivante --------------
Une pièce jointe non texte a été nettoyée...
Nom: bp.diff
Type: text/x-patch
Taille: 1455 octets
Desc: non disponible
Url: http://the-doors.enix.org/pipermail/sos/attachments/20051205/9e147e72/bp.bin
-------------- section suivante --------------
Une pièce jointe non texte a été nettoyée...
Nom: q.jpg
Type: image/jpeg
Taille: 4512 octets
Desc: non disponible
Url: http://the-doors.enix.org/pipermail/sos/attachments/20051205/9e147e72/q.jpg


Plus d'informations sur la liste de diffusion Sos