[SOS] frequence timer - QEMU

anthoine.bourgeois anthoine.bourgeois at orange.fr
Ven 7 Nov 19:32:35 CET 2008


Bonjour,


> Message du 06/11/08 20:19
> De : "free mail" <lebre.adrien at free.fr>
> A : "anthoine.bourgeois" <anthoine.bourgeois at orange.fr>
> Copie à : "SOS mailing-list" <sos at the-doors.enix.org>
> Objet : Re: [SOS] frequence timer - QEMU
> 
> 
> Salut,
> 
> je lance mon kernel (à cette étape de l'explication d'un OS aux  
> étudiants seulement le driver ecran est ok) et je vais leur faire  
> afficher l'heure.
> Pour cela j'initialise le 8254, puis j'exploite un handler ticTac qui  
> me permet de compter les secondes.
> 
> #define FREQ 1000
> int count = 0;
> int total_sec =0;
> 
> AfficheHeure() {
> 	int sec=0;
> 	int min=0;
> 
> 	sec  = total_sec% 60;
> 	min = total_sec / 60  ;
> 
> 	kprintf("%d:%d",min,sec);
> }
> 
> void ticTac(int o) {
> 	compt++;
> 	if(compt%FREQ==0) {
> 		globalsecondes++;
> 		compt=0;
> 	}
> }
> 
> void main(){
> 
> 	i8254_set_frequency(FREQ);
> 	irq_set_routine(IRQ_TIMER, ticTac);
> 	asm volatile("sti\n");//Autorise les interruptions
> 
> 	while(1)
> 		afficheHeure();
> 
> }
> 
> 
> En essayant plusieurs manipulations assez 'empiriques' il faut  
> l'avouer, je n'ai pas reussi à obtenir des secondes qui dure  
> concrètement des secondes.
> Meme mieux, j'ai l'impression que quelque soit la frequence que  
> j'initialise cela ne change rien et ceux même si le modulo dans le  
> handler d'interruption est réalisé de manière erronée (exemple:  
> initialisation de la frequence à 1000 et division par 100 dans le  
> handler).
> A noter néanmoins que le comportement diffère (en gros les secondes  
> n'ont pas la meme durée) entre un qemu au dessus de windows ou bien un  
> qemu au dessus de Linux (dans les deux cas l'acceleration de qemu  
> n'est pas utilisée).

Je n'utilise pas kqemu non plus.

De mon coté les durées des secondes varies beaucoup.

Je savais que qemu était très mauvais pour la gestion du temps et
ca se confirme.

Il me semble que les secondes sont vraiment des secondes pour FREQ=100.
Cette valeur peut s'expliqué par le fait que le tic de linux est
de 100Hz (pour mon système, c'est modifiable) et que l'horloge de
qemu se calque dessus.
Quelque soit l'interval programmé par SOS pour le timer, l'horloge 82C54 virtuelle
de qemu se déclanche tous les 10ms. Donc pour une base d'interval de 10ms,
on a 10ms * FREQ = 1000ms et on retrouve notre seconde.

Si on baisse FREQ on se rapprochera des 10ms donc nos seconde SOS seront
rapide et inversement avec FREQ élevé nos secondes s'étirent en longueur.

Le compteur vert en haut à droite de l'article 2 de SOS qui représente
le nombre d'interruption d'horloge semble confirmé cette hypothèse
puisqu'il ca vitesse ne varie apparement pas quelque soit la valeur
de FREQ.

C'est problèmatique pour une démonstration.

Cordialement,
Anthoine



Plus d'informations sur la liste de diffusion Sos