[SOS] Probe memory

Thomas Petazzoni thomas.petazzoni at enix.org
Lun 20 Déc 17:13:56 CET 2004


Hello,

LfvrChris at aol.com a écrit :

>     Il rest encore quelques points à éclaircir en ce qui concerne le 
> code ci-dessous. Notamment l'instruction suivante:
>  
> *asm("":::"memory");*
>  
> Que veut-elle dire ?
> Quelle est son rôle ?

C'est de l'assembleur inline GCC en notation étendue. En gros, le format 
c'est (de mémoire) :

asm("instructions":"output registers":"input registers":"cloberred 
registers");

Les cloberred registers, ce sont les registres qui sont modifiés par les 
"instructions", mais qui ne sont ni des registres de sortie ou d'entrée. 
Cela permet d'indiquer à gcc sur quels registres il ne faut pas compter 
(il a besoin de savoir ça car il fait des optimisations diverses et 
variées utilisant les registres).

L'instruction veut donc dire que "la mémoire a été touchée", ce qui 
indique à GCC qu'il ne faut pas compter sur les valeurs qu'il avait 
précédemment lues de la mémoire dans des registres, et qu'il faut bien 
tout aller relire de la mémoire.

Je commente rapidement le code.

On sauvegarde le masque actuel des IRQs.

> * irq1=inb(0x21);
>  irq2=inb(0xA1);*

On désactive les IRQs. (un "cli" serait sans doute plus simple)

> * outb(0x21, 0xFF);
>  outb(0xA1, 0xFF);*

Initialisation des variables

> * mem_count=0;
>  memkb=0;*

On s'assure que le contenu du cache de données est cohérent avec celui 
de la mémoire.

> * asm volatile ("wbinvd");*

> * do
>  {

On incrémente la taille de la mémoire.

>   memkb++;
>   mem_count+=1024*1024;
>   mem=(unsigned long*)mem_count;*

On met de coté dans 'a' le contenu de la mémoire à l'adresse mem.

> *  a=*mem;*

On écrit un mot magique dans la mémoire à l'adresse mem.

> *  *mem=0x55AA55AA;*

On dit à GCC de pas faire son boulet en optimisant. Toutes les valeurs 
qu'il avait placées dans des registres sont "oubliées".

> *  asm("":::"memory");

On relit depuis la mémoire la valeur à l'adresse 'mem'. Si c'est le mot 
magique, alors il y a peut être de la mémoire à cette adresse (partie 
'else'), si ce n'est pas le mot magique, alors il n'y a pas de mémoire à 
cette adresse (l'écriture *mem = 0xMOTMAGIQUE est partie dans l'espace 
intersidéral des bus mémoire).

>   if(*mem!=0x55AA55AA)
>    mem_count=0;
>   else
>   {
>    *mem=0xAA55AA55;

On vérifie une deuxième fois avec un autre mot magique qu'il y a bien de 
la mémoire à cette adresse et que ce n'est pas une valeur hard-codée 
(par exemple à cause d'un périphérique mappé en mémoire à cette 
adresse). Enfin je suppose que c'est l'intention.

>    asm("":::"memory");
>    if(*mem!=0xAA55AA55)
>     mem_count=0;
>   }*
> ** 
> *  asm("":::"memory");

On remet le mot sauvegardé en mémoire.

>   *mem=a;
>  } while(memkb<4096 && mem_count!=0);*

Je ne sais pas trop ce qu'il y a  l'adresse 0X413 << 6, mais bon.

> * mem_end=memkb<<10;
>  mem=(unsigned long*)0x413;
>  bse_end=((*mem)&0xFFFF)<<6;*

On remet les interruptions comme elles étaient.

> * outb(0x21, irq1);
>  outb(0xA1, irq2);*

Note pour toute cette histoire : utilise Grub.

Déterminer la taille de la mémoire sur archi x86, c'est chiant, lourd, 
inutile, tout ça. Grub fait ça tout bien pour toi. Alors vive Grub.

Bonne journée,

Thomas
-- 
PETAZZONI Thomas - thomas.petazzoni at enix.org
http://thomas.enix.org - Jabber: thomas.petazzoni at jabber.dk
http://kos.enix.org, http://sos.enix.org
Fingerprint : 0BE1 4CF3 CEA4 AC9D CC6E  1624 F653 CB30 98D3 F7A7
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 256 bytes
Desc: OpenPGP digital signature
Url : http://the-doors.enix.org/pipermail/sos/attachments/20041220/18654d3b/signature.pgp


Plus d'informations sur la liste de diffusion Sos