udelay & mdelay
driver常常會需要很短且精準的delay(n microsecond/millisecond),以完成sync。此時用jiffies就不恰當,第一單位不夠小,如果timer是100Hz,表示一個tick是10 millisecond。第二不夠準,因為透過scheduler。在kernel裡有兩個function來完成很小的delay,不使用jiffies:
在<linux/delay.h>
void udelay(unsigned long usecs) void mdelay(unsigned long msecs)
兩個都是busy waiting。udelay的實作要先談BogoMIPS,這個值是指在特定時間內CPU可執行多少個busy loop operation。也就是說,這個CPU不做任何事可以多快 (how fast a processor can do nothing)。這個值在kernel裡是一個叫做loops_per_jiffy的變數,在userspace則可在/proc/cpuinfo裡找到。而kernel是在init/main.c裡透過calibrate_delay()這個function來計算。值得一提的是這個值是跟performance沒太大關係的。