[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