Deine Sleep-Funktion führt ja busy waiting durch, und ist deswegen für ein Multitaskingsystem nicht geeignet. Besser ist es, wenn ein Task/Prozess/Thread den Sleep-Systemaufruf durchführt, diesen in den Blockieren zu lassen und während des Wartens einen anderen Task (sofern einer existiert) laufen zu lassen. Auch falls du diese Funktion nur im Kernel (beispielsweise ein Floppy-Treiber im Kernel) nutzt, verlierst du damit die Vorteile eines Multitaskingssystems (während ein Task auf I/O wartet, kann ein anderer die CPU nutzen).
Viele Systeme haben deswegen für Prozesse Zustände wie Running, Blocked, ... (
viele bunte Bilder) eingeführt. Ein Prozess der auf I/O wartet (beispielsweise bei einem Sleep auf einen Timer-IRQ oder bei einem Floppy-Treiber auf den Floppy-IRQ), wird blockiert und beim Scheduling so lange übersprungen, bis der IRQ-Handler, auf den der Prozess wartet, den Prozess wieder laufen lässt (natürlich mit deiner bevorzugten Anzahl Abstraktionsschichten dazwischen).
Wenn du das Multitasking mit 10 Hz laufen lassen willst, aber sleep() mit einer Auflösung von 1 ms haben willst, kannst du beispielsweise den Timer auf 1 ms stellen und nur bei jedem 100sten Interrupt schedule() aufrufen.
Seltsam ist bei meiner Varriante von Sleep-Funktion auch, dass vor dem Multitasking (aber schon aktivem Timer IRQ) meine Sleep-Funktion die Zeit abwartet und es danach weiter im Kernel geht. Sobald das Multitasking aktiv ist, sprich auch Task laufen & ich dann z.B. mein Floppy-Laufwerk ansteuer und die Sleepfunktion aufgerufen wird kommt er nicht mehr aus der while Schleife herraus.
Deaktivierst du Interrupts in den Funktionen, die das Diskettenlaufwerk ansteuern?