D'après Lars Wirzenius wirzeniu@kruuna.Helsinki.fi
,
courrier du 9 septembre 1993, expliquant ce que sont les BogoMips, et
quelques informations complémentaires de Win van Dorst :
MIPS est l'abréviation de Millions d'Instructions Par Seconde. C'est une façon de mesurer la vitesse de traitement d'un programme par un microprocesseur. Comme la plupart des unités de ce type, on l'utilise le plus souvent abusivement (il est très difficile de comparer correctement les vitesses exprimées en MIPS de différents types de microprocesseurs).
Les BogoMips sont une invention de Linus. Le noyau (ou peut-être un pilote de périphériques ?) a besoin d'une boucle d'attente (le temps d'attente est trop court ou requiert une trop grande précision pour utiliser une autre méthode qu'une attente active) qu'il est nécessaire de calibrer en fonction de la vitesse du processeur sur lequel Linux s'exécute. Ainsi le noyau mesure lors du démarrage la vitesse d'exécution d'une boucle d'instructions déterminée. Bogo vient de l'américain bogus, qui signifie faux, bidon. Une vitesse en BogoMips donne donc une indication de la vitesse d'un microprocesseur, mais l'unité est définie trop peu scientifiquement pour que l'on puisse l'appeler autrement qu'un BogoMips.
Les raisons (il y en a deux) pour lesquelles la mesure de cette vitesse est affichée lors du démarrage du noyau sont :
L'algorithme C qui calcule le nombre de BogoMips se trouve dans le
fichier source /usr/src/linux/init/main.c
, et c'est la
variable du noyau associée loops_per_sec
(boucles par
seconde) qui est utilisée par de nombreux pilotes pour des besoins
plus concrets. La fonction d'attente à proprement parler udelay()
est
en assembleur, c'est pourquoi chaque portage en a sa propre définition dans
/include/asm/delay.h
.
La variable loops_per_sec
et la fonction udelay()
sont utilisés dans
de nombreux drivers, regarder :
cd /usr/src/linux #où la ou les sources sont stockées find . -name '*.[hcS]' -exec fgrep loops_per_sec {} /dev/null \; find . -name '*.[hcS]' -exec fgrep udelay {} /dev/null \;