Triple Fault: Difference between revisions
Jump to navigation
Jump to search
[unchecked revision] | [unchecked revision] |
Content deleted Content added
m →Avoiding: Add link to TSS |
Clarified cause is on invocation, not merely while running an exception handler |
||
Line 6: | Line 6: | ||
==Causes== |
==Causes== |
||
When a fault occurs, the CPU invokes an exception handler. If a fault occurs while |
When a fault occurs, the CPU invokes an exception handler. If a fault occurs while trying to invoke the exception handler, that's called a double fault, which the CPU tries to handle with yet another exception handler. If that invocation results in a fault too, the system reboots with a triple fault. |
||
Note that a fault that occurs while a fault handler is already running does not of itself cause a double or triple fault. For example, if a Segment Not Present Fault occurs after a handler has already started, then the Segment Not Present handler will run as normal. However, if the code segment of the original handler is itself not Present, then the double (or triple) fault would occur since the original handler hadn't started yet. |
|||
⚫ | |||
⚫ | |||
Another frequent cause of triple faults is a kernel stack overflow. If the stack reaches an invalid page (one with its present bit clear), a page fault is generated. However, the CPU faults while trying to push the exception information on to the stack, so a double fault is generated. The same problem still exists so a triple fault is generated. |
Another frequent cause of triple faults is a kernel stack overflow. If the stack reaches an invalid page (one with its present bit clear), a page fault is generated. However, the CPU faults while trying to push the exception information on to the stack, so a double fault is generated. The same problem still exists so a triple fault is generated. |
||
Line 14: | Line 16: | ||
==Avoiding== |
==Avoiding== |
||
The cleanest way to handle this is to provide a separate [[Task State Segment|TSS]] for double faults and to use a task gate for that kind of |
The cleanest way to handle this is to provide a separate [[Task State Segment|TSS]] for double faults and to use a task gate for that kind of exception. Try to keep that Task as simple as possible, and give it a dedicated stack segment and pointers. |
||
* display "double fault" panic message |
* display "double fault" panic message |