|
@@ -9,9 +9,9 @@ zombie. While the thread is in user space the kernel stack is empty
|
|
|
except for the thread_info structure at the bottom.
|
|
|
|
|
|
In addition to the per thread stacks, there are specialized stacks
|
|
|
-associated with each cpu. These stacks are only used while the kernel
|
|
|
-is in control on that cpu, when a cpu returns to user space the
|
|
|
-specialized stacks contain no useful data. The main cpu stacks is
|
|
|
+associated with each CPU. These stacks are only used while the kernel
|
|
|
+is in control on that CPU; when a CPU returns to user space the
|
|
|
+specialized stacks contain no useful data. The main CPU stacks are:
|
|
|
|
|
|
* Interrupt stack. IRQSTACKSIZE
|
|
|
|
|
@@ -32,17 +32,17 @@ x86_64 also has a feature which is not available on i386, the ability
|
|
|
to automatically switch to a new stack for designated events such as
|
|
|
double fault or NMI, which makes it easier to handle these unusual
|
|
|
events on x86_64. This feature is called the Interrupt Stack Table
|
|
|
-(IST). There can be up to 7 IST entries per cpu. The IST code is an
|
|
|
-index into the Task State Segment (TSS), the IST entries in the TSS
|
|
|
-point to dedicated stacks, each stack can be a different size.
|
|
|
+(IST). There can be up to 7 IST entries per CPU. The IST code is an
|
|
|
+index into the Task State Segment (TSS). The IST entries in the TSS
|
|
|
+point to dedicated stacks; each stack can be a different size.
|
|
|
|
|
|
-An IST is selected by an non-zero value in the IST field of an
|
|
|
+An IST is selected by a non-zero value in the IST field of an
|
|
|
interrupt-gate descriptor. When an interrupt occurs and the hardware
|
|
|
loads such a descriptor, the hardware automatically sets the new stack
|
|
|
pointer based on the IST value, then invokes the interrupt handler. If
|
|
|
software wants to allow nested IST interrupts then the handler must
|
|
|
adjust the IST values on entry to and exit from the interrupt handler.
|
|
|
-(this is occasionally done, e.g. for debug exceptions)
|
|
|
+(This is occasionally done, e.g. for debug exceptions.)
|
|
|
|
|
|
Events with different IST codes (i.e. with different stacks) can be
|
|
|
nested. For example, a debug interrupt can safely be interrupted by an
|
|
@@ -58,17 +58,17 @@ The currently assigned IST stacks are :-
|
|
|
|
|
|
Used for interrupt 12 - Stack Fault Exception (#SS).
|
|
|
|
|
|
- This allows to recover from invalid stack segments. Rarely
|
|
|
+ This allows the CPU to recover from invalid stack segments. Rarely
|
|
|
happens.
|
|
|
|
|
|
* DOUBLEFAULT_STACK. EXCEPTION_STKSZ (PAGE_SIZE).
|
|
|
|
|
|
Used for interrupt 8 - Double Fault Exception (#DF).
|
|
|
|
|
|
- Invoked when handling a exception causes another exception. Happens
|
|
|
- when the kernel is very confused (e.g. kernel stack pointer corrupt)
|
|
|
- Using a separate stack allows to recover from it well enough in many
|
|
|
- cases to still output an oops.
|
|
|
+ Invoked when handling one exception causes another exception. Happens
|
|
|
+ when the kernel is very confused (e.g. kernel stack pointer corrupt).
|
|
|
+ Using a separate stack allows the kernel to recover from it well enough
|
|
|
+ in many cases to still output an oops.
|
|
|
|
|
|
* NMI_STACK. EXCEPTION_STKSZ (PAGE_SIZE).
|
|
|
|