Ich bin gerade zu faul in den Intel Manuals nachzugucken, aber wie bekommt man eigentlich raus das eins (und vorallem welches es dann ist) falsch war?
Dass eins falsch war, bekommt man mit einem General Protection Fault mit. Welches das ist, nur durch den nachfolgenden Einsatz eines Disassemblers. Aber man muss eh alle Register mit korrekten Werten neuladen, wenn ein GPF auftritt, siehe unten.
Man benutzt eben ein architektur-spezifisches Feature um ein architektur-spezifisches Problem zu lösen.
Es gab kein Problem, also wurde auch keines nicht gelöst. Wenn man hingegen deine Idee einmal weiterdenkt, dann stößt man auf Probleme.
- Der GPF-Handler muss ein Sonderfall werden, weil der ja nicht wieder über die sabotierten Segment Register stolpern soll. Also muss er immer die Segment Register neuladen.
- Wenn man den Virtual-8086 Mode unterstützen will, dann muss man auch in allen IRQ-Handlern und in den meisten Exception-Handlern die Register neuladen, weil alle Exceptions und Interrupts aus dem Virtual-8086 Mode mit genullten Segment Registern im Kernel ankommen.
- Man muss weiterhin darauf aufpassen, dass kein Interrupt-Handler Locks annimmt. Weil diese Exception könnte auftreten, während ein Lock gehalten wird. Da lässt der Dead Lock dann nicht lange auf sich warten.
- Ich nehme mal an, dass es im Kernel sowas wie eine globale (cpu-lokale) Variable "current_task" gibt, und dass das die einzige Möglichkeit ist, im Exception Handler festzustellen, welcher Task der Verursacher der Exception war. Man muss jetzt aufpassen, dass diese Exception nicht auftritt, nachdem ein Kontext Wechsel stattgefunden hat, also current_task geändert wurde. Sonst würde der falsche Task gekillt werden. Ich sehe keine Möglichkeit das zu garantieren, außer durch Neuladen der Segment Register.
Ich finde eriks Idee immer besser.