Строка 461
Функция calibrate_delay () в init/main. с рассчитывает и выводит значения откалиброванных «BogoMips», означающих количество итераций delay (), которые может выполнить ваш процессор за один тик таймера; calibrate_delay () позволяет примерно уравнять задержки на процессорах с разной скоростью. Результирующее значение — это в основном индикатор скорости работы процессора, который хранится в loop_pre_j if fу, а функции udelay () и mdelay () используются для установки количества выполняемых итераций delay ():
Init/main.с
void init calibrate_delay(void)
{
unsigned long ticks, loopbit; int lps_precision = LPS_PREC; 186 loops_per_jiffy = (1«12);
printk("Calibrating delay loop... ") ; 189 while (loops_per_jiffy «= 1) {
/* ожидание "запускающего" тика часов */
ticks = jiffies;
while (ticks == jiffies)
/* ничего*/; /* Запуск.. */ ticks = jiffies;
delay(loops_per_jiffy);
ticks = jiffies - ticks; if (ticks) break; 200 }
/* Выполнение бинарной аппроксимации для установки loops_per_jiffy,
равной одному (до lps_precision бит) */ 204 loops_per_jiffy >>= 1;
loopbit = loops_per_jiffу; 206 while ( lps_precision-- && (loopbit »= 1) ) {
loops_per_jiffy |= loopbit;
ticks = jiffies;
while (ticks == jiffies);
ticks = jiffies;
delay(loops_per_jiffy);
if (jiffies != ticks) /* longer than 1 tick */
loops_per_jiffy &= -loopbit; 214 }
/* Округление и вывод значения */ 217 printkt"%lu.%021u BogoMIPS\n",
loops_per_jiffy/(500000/HZ), 219 (loops_per_jiffy/(5000/HZ)) % 100); }
Строка 186
Начало в 0x800.
Строки 189-200
Сохранение удвоенного loops_per_j if f у до тех пор, пока занимаемое функцией delay (loops_per_j if fy) не достигнет одного мгновения.
Строка 204
Деление loops_per_jif fy на 2.
Строки 206-214
Добавление убывающей степени 2 к loop_per_ j i f f у до тех пор, пока тик не станет равен моменту.
Строки 217-219
Распечатка значений в вещественном формате.