Name : Joerg Grieger
E-Mail : grieger@vsys.de
Betr. : Linux ab Kernel 2.2 und Interrupts
Hallo,
Ich muss fuer eine Berechnung ueber laengere Zeit die Interrupts
sperren.
Dabei habe ich festgestellt, dass nach einer weile die Systemzeit nicht
mehr stimmt. Den Code zum sperren und wieder freigeben der Interrupts
habe
ich wie folgt aufgebaut :
#include
#include
#include
#include
#include
int main(void)
{
int i, j;
unsigned long flags = 0;
struct timeval tv1, tv2, tv3;
struct timezone tz1, tz2, tz3;
/* Zugriff auf I/O Speicher erlauben */
iopl(3);
/* Anfangszeit */
gettimeofday(&tv1, &tz1);
/* Flags speichern und Interrupts sperren */
save_flags(flags);
cli();
/* Hier wird nun eine Berechnung durchgefuehrt. */
for(i = 0; i < 10000; i++)
for(j = 0; j < 10000; j++);
/* Waehrend die Interrupts noch gesperrt sind 2. Zeit holen */
gettimeofday(&tv2, &tz2);
/* Flags zurueckspeichern -> Interrupts wieder freigeben */
restore_flags(flags);
/* Endzeit */
gettimeofday(&tv3, &tz3);
/* Zeiten ausgeben */
printf("T1 : %ld:%ld, T2 : %ld:%ld, T3 : %ld:%ld\n",
tv1.tv_sec, tv1.tv_usec,
tv2.tv_sec, tv2.tv_usec,
tv3.tv_sec, tv3.tv_usec);
return(0);
}
Dieses sind nun die Ausgaben auf einem AMG K6 266 - SuSE Linux 2.2.5:
T1 : 943538711:987246, T2 : 943538712:361767, T3 : 943538712:2039
T1 : 943538718:773989, T2 : 943538719:148511, T3 : 943538718:779667
T1 : 943538719:807989, T2 : 943538720:182510, T3 : 943538719:823830
T1 : 943538720:493990, T2 : 943538720:868512, T3 : 943538720:507967
T1 : 943538721:153157, T2 : 943538721:527679, T3 : 943538721:158761
T1 : 943538721:777705, T2 : 943538722:152227, T3 : 943538721:792865
T1 : 943538722:457681, T2 : 943538722:832202, T3 : 943538722:472474
Das Programm lauft im User-Space. Habe es aber auch schon als
Kernel-Modul
compiliert versucht, aber der Fehler blieb.
Vielleicht ist meine Routine aber nur falsch ? Dieser Code steht aber so
des oefteren in den Sourcen des Kernels.
Habe das gleiche Programm auch auf anderen Systemen getestet.
Bei 2.0er Kerneln lauft das Programm korrekt.
Auf einem Dual Celeron System mit 2.2.10er Kernel trat der Fehler
bei ungefaehr der haelfte der Testlaufe auf.
Ich hoffe Sie koennen mir weiterhelfen.
Mit freundlichen Gruessen
Joerg Grieger
---------------------------------------------------------------------
To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com
For additional commands, e-mail: suse-linux-help@suse.com