Ich lese Linux Kernel Entwicklung vor kurzem, und ich habe ein paar Fragen im Zusammenhang mit der Deaktivierung der Vorkaufsrechte.
Im Abschnitt "Interrupt Control" in Kapitel 7 heißt es:
Darüber hinaus deaktiviert das Deaktivieren von Interrupts auch die Kernel-Vorbelegung.
Ich lese auch aus dem Buch, dass Kernel Preemption in den folgenden Fällen auftreten kann:
Wenn ein Interrupt-Handler beendet wird, bevor er zum Kernel-Space zurückkehrt.
Wenn Kernel-Code wieder präemptiv wird.
Wenn eine Task im Kernel explizit schedule ()
aufruft Wenn eine Task in einem Kernel blockiert (was zu einem Aufruf von schedule () führt)
Aber ich kann Interrupts nicht mit diesen Fällen in Verbindung bringen.
Soweit ich weiß, würde ein Spinlock die Vorbelegung mit der Funktion preempt_disable () deaktivieren.
Der Beitrag Was genau sind "Spin-Locks"? sagt:
Auf einer Single-Core-Maschine ist ein Spinlock einfach ein "disable interrupts" oder "raise IRQL", was die Thread-Planung komplett verhindert.
Schaltet preempt_disable () die Vorbelegung durch Deaktivierung von Interrupts aus?
Ich bin kein Scheduler-Guru, aber ich würde gerne erklären, wie ich es sehe. Hier sind einige Dinge.
thread_info->preempt_count
Variable. Sie können sehen, was preempt_disable () ist. Versuche dies: 1. Holen Sie sich einen Spinlock. 2. Anrufliste ()
Im dmesg werden Sie etwas wie "BUG: Scheduling atomic" sehen. Dies geschieht, wenn der Scheduler erkennt, dass Ihr Prozess im atomaren (nicht präemptiven) Kontext läuft, aber sich selbst plant.
Viel Glück.
In einem Kernel-Testmodul, das ich geschrieben habe, um eine Aufgabe zu überwachen / zu profilieren, habe ich versucht, Interrupts zu deaktivieren durch:
1 - Verwenden von local_irq_save ()
2 - Verwenden von spin_lock_irqsave ()
3 - Manuell disable_irq () für alle IRQs in / proc / interrupts
In allen 3 Fällen konnte ich den hrtimer immer noch verwenden, um die Zeit zu messen, obwohl IRQs deaktiviert waren (und eine Aufgabe, die ich überwachte, wurde ebenfalls vorweggenommen).
Ich finde das veeeeeerrrryyyy komisch ... Ich persönlich habe erwartet, worauf Sebastian Mountaniol hingewiesen hat - & gt; Keine Unterbrechungen - keine Uhr. Keine Uhr - keine Timer ...
Linux Kernel 2.6.32 auf einem Single-Core, Single-CPU ... Kann jemand eine bessere Erklärung haben?
Tags und Links linux linux-kernel interrupt spinlock preemption