2017-04-23 2 views
0

Nach meinem Verständnis gibt es einen separaten Kernel-Stack für jeden Benutzerprozess.Kernel Stack für einen Benutzerprozess | Linux Kernel

Wie dieser Kernel-Stack verwendet wird, warum können wir nicht einfach einen Stack für alle Benutzerprozesse verwenden? Wie hilft uns das mit Vorkaufsrecht? Wenn der Kernel im Interrupt-Kontext ausgeführt wird, welcher Stack wird verwendet?

[EDIT: Die Architektur von Interesse ist, x86]

Antwort

2

Wie dieser Kernel-Stack

verwendet wird

Es zum Beispiel verwendet, wenn Usermode-Prozess Kernel durch syscall eintritt. Im Syscall-Handler innerhalb des Kernels verwenden Sie den Kernel-Stack für lokale Variablen.

Warum können wir nicht einfach einen Stapel für alle Benutzerprozesse verwenden?

Aber wie? Wie werden sie es gleichzeitig auf SMP-Systemen verwenden? Dies führt zu Datenbeschädigungen.

Wie hilft uns das mit Vorkaufsrecht?

Ich bin mir nicht sicher, wonach Sie fragen. Grundsätzlich bezieht es sich auf das Vorkaufsrecht sehr indirekt. Wenn Sie vom System-Timer unterbrochen wurden, wechseln Sie wahrscheinlich zu einem anderen Thread mit einem anderen Kernel-Stack. Der Kontext kann oben auf diesem Stapel gespeichert werden (ich bin mir nicht sicher, ob Linux es auf die gleiche Weise implementiert). Auch gibt es eine preempt_counter Sache in Linux, die oben auf dem Kernel-Stack platziert. Diese Variable könnte um preempt_disable(enable) inkrementiert/dekrementiert werden. Was bedeutet, dass Kernel-Thread-Vorkauf switched off/on. Es ist weit verbreitet z.B. von spinlocks.

Wenn der Kernel im Interrupt-Kontext ausgeführt wird, welcher Stack wird verwendet?

Wenn wir von Benutzer gehen -> Kernel in diesem Fall ist folgendes passiert:

  1. Der Kernel-Stack verwendet wird. Der Prozessor schaltet auf diesen Stapel um, der durch die Felder SS0 und ESP0 der TSS definiert ist.
  2. der Prozessor die Ausnahme Parameter auf dem Kernel-Stapel

      +--------------------+ KSTACKTOP    
         | 0x00000 | old SS |  " - 4 
         |  old ESP  |  " - 8 
         |  old EFLAGS  |  " - 12 
         | 0x00000 | old CS |  " - 16 
         |  old EIP  |  " - 20 <---- ESP 
         +--------------------+    
    
  3. Der Prozessor liest IDT Eintrag N (je nachdem, welche IRQ oder eine Ausnahme aufgetreten ist) und setzt CS drückt: EIP auf die Behandlungsfunktion beschrieben Punkt durch der Eintritt.

  4. Die Handler-Funktion übernimmt die Kontrolle und behandelt die Ausnahme.

Quelle: https://pdos.csail.mit.edu/6.828/2016/labs/lab3/

+0

den Link, den Sie bieten Nach der Überprüfung, ich vermute, dass Sie nicht ganz meine Frage Außerdem versteht, kann man deutlich in Ihrem Fall sehen, dass es nur für einen Stack im Kernel ist alle Prozesse. Die Frage ist spezifisch für den Linux-Kernel. –

+0

Das TSS-Segment wird während des Kontextwechsels geändert. Daher gibt es für jeden Prozess unterschiedliche TSSs (dh unterschiedliche Stapel). Ich denke, Linux verwendet den gleichen Ansatz, nicht wahr? Kannst du annehmen, wie es anders geht? –