Anatomie d'un bug
By Samuel D. - 14/12/2004
Sommaire:

 

Fonctionnement normal

 

Comme vous le savez déjà, Memtest86+ inclus des fonctions de détection des timings mémoires, du FSB ainsi que de la fréquence mémoire et du mode de fonctionnement (Single ou Dual Channel). Voici par exemple, un screenshot de Memtest86+, fonctionnant sur une plate-forme Northwood :

 

 

On le voit, toute les informations sont affichées sans problème, que ce soit les timings mémoire, le FSB ou autre. Vu que le code qui affiche ces données est proche sur tout les chipsets, il n'y a normalement aucune raison qu'un bug surviennent sur une plate-forme, et pas une autre. Ainsi, nous avons pu tester cette version de Memtest86+ sur une multitude de plate-forme allant de l'Athlon 64 au Pentium M sans noter de problème, particulièrement sur l'affichage du FSB :

 

 

Afin de bien comprendre de quoi il s'agit, regardons maintenant le code, pour un i915/925, qui génère ces valeurs. Il s'agit de la fonction poll_fsb_i925() du fichier controler.c :

 

 

Le calcul du FSB (première flèche rouge) n'est pas bien compliqué. Celui ci récupère la fréquence du processeur en KHz calculée via l'instruction RDTSC et la divise par le coefficient multiplicateur, récupéré par MSR par la fonction getP4PMultiplier() que voici :

 

 

Pour revenir à notre multiplication, la valeur "coef" ne peut être zéro car ceci générerait une division par zéro et planterais le programme. Voyons maintenant un désassemblage du bout de code suivant, en 32 bits et avec le moins d'entrée 0x0A00 sur le binaire de Memtest86+ :

 

 

extclock est mis dans eax, la valeur 1000 (0x3E8 en hexa) est mise dans edx, puis ecx et la division est effectuée. Ensuite une seconde division est effectuée, celle du coefficient multiplicateur du CPU. Ce code fonctionne sans problème sur toute les plates-formes sans causer de bug.

 

 

Suite ( Apparition du bug )

Fermer