Ich habe Kapitel 7 in den
In meinem Kernel-Modul speichere ich einen Jiffies-Wert, der in der Zukunft eingestellt wird, und vergleiche ihn zu einem späteren Zeitpunkt mit dem aktuellen Jiffies-Wert. Ich habe bereits gelernt, dass es Funktionen gibt, die den 32bit Jiffy Wrap berücksichtigen, um zwei Werte zu vergleichen, die ich verwende:
%Vor%Hier kommt meine Frage: Nun möchte ich den 'some_future_jiffies_value' auf "now + 10ms" setzen. Dies kann leicht erreicht werden, indem Sie dies tun:
%Vor%Stimmt das? Was passiert, wenn der aktuelle Jiffies in der Nähe von MAX_JIFFY_OFFSET liegt und der resultierende Wert von msecs_to_jiffies (10) den Wert von some_future_jiffies_value hinter diesen Offset stellt? Wird es automatisch umbrochen oder sollte ich etwas Code hinzufügen, um dies zu überprüfen? Gibt es Funktionen, die mich davor bewahren, damit umgehen zu müssen?
Aktualisierung:
Um Sachen mit Wraparound zu vermeiden, habe ich meine Schlafschleife umgeschrieben:
%Vor%Ich nehme an, das ist tragbarer, oder?
Update 2:
Vielen Dank, dass Sie sich die Zeit genommen haben, auf diese Frage zurückzukommen und auch etwas Feedback zu meinen Kommentaren zu geben. Mein Kernel-Treiber funktioniert jetzt gut und es ist viel weniger hässlich im Vergleich zu der Situation, bevor Sie mir all diese Tipps gegeben haben. Danke!
Was Sie hier implementieren, ist im Wesentlichen msleep_interruptible () (linux / kernel / timer.c)
%Vor%Diese Funktion hat den Vorteil, dass die Angabe in Millisekunden erfolgt und die Details des internen Jiffies-Wrappings ausgeblendet werden. Überprüfen Sie die Rückgabewerte, da dieser Aufruf die Anzahl der verbleibenden Jiffies zurückgibt. Null bedeutet, dass der Anruf die angegebene Anzahl von Millisekunden lang geschlafen hat, während ein Wert ungleich Null anzeigt, dass der Anruf so früh wie möglich unterbrochen wurde.
Bezüglich der Umhüllung, siehe Abschnitt 6.2.1.2 für eine Beschreibung von jiffies und Verpackung. Auch dieser Beitrag versucht das Wrapping im Abstract zu beschreiben.
Tags und Links c linux-kernel