Exceptions sind nicht grundsätzlich Fehler, die können auch eingeplant sein. Klassisches Beispiel ist der Page Fault beim Swapping.
09. November 2026, 18:30
Aber NMI benutzen, das nenne ich konsequent!Zitat von: erikAber Du bist doch so sehr für einen unterbrechbaren Kernel eingetreten und wenn Du HW-IRQs im Kernel willst dann sind Exceptions auch nicht mehr schlimm.Das sind für mich 2 Paar Schuhe.

Letztere möchte ich nicht im Kernel behandeln, denn Exception könnte bedeuten das ich den Fehler nicht behandeln kann und das Programm muss gekillt werden, versuch das mal mit deinem KernelKlar will man den Kernel nicht killen aber gerade bei diesem speziellen Fehler "verbogene Segmentregister" ist es eindeutig das nicht der Kernel sondern ein User-Mode-Prozess gekillt werden muss. Ich bin schon der Meinung das es sich hierbei um eine spezielle Situation handelt für die man auch mal eine Ausnahme von der Regel machen kann (bekommst ja auch etwas Performance dafür geschenkt), aber wenn Du das anders siehst dann ist das Okay für mich.
Eine Exception im Kernel heißt bei mir grundsätzlich PANIC().Bei mir auch, das ist sogar von der HW so vorgegeben.
Aber NMI benutzen, das nenne ich konsequent! WinkIch überlege immer nebenher, wie ich diesen NMI wieder loswerden kann

aber gerade bei diesem speziellen Fehler "verbogene Segmentregister" ist es eindeutig das nicht der Kernel sondern ein User-Mode-Prozess gekillt werden muss.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?
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.
Exceptions sind nicht grundsätzlich Fehler, die können auch eingeplant sein. Klassisches Beispiel ist der Page Fault beim Swapping.Swapping habe ich noch nicht, aber recht hast du trotzdem, hatte mal mit dem Gedanken gespielt lazy mapping im Kernel zuzulassen.
Dass eins falsch war, bekommt man mit einem General Protection Fault mit.Das ist mir schon klar, aber nen GPF wird ja nicht nur deswegen, sondern auch noch aus anderen Gründen geworfen. Du müsstest also erstmal rausfinden das ein fehlerhaftes Segment Register der Grund war und dann musst du noch unterscheiden ob es einfach "nur" ein Zugriff über Segmentgrenzen hinaus war (ist bei mir bei TLS möglich).
Welches das ist, nur durch den nachfolgenden Einsatz eines Disassemblers.Wenn man davon ausgeht, das es eh nur ds, es, fs oder gs sein können die falsch sind, dann wäre es doch einfacher, sie entweder mit Standardwerten zu laden oder einfach die 4 zu überprüfen, aber ich glaube nicht das man einen Disassembler dafür bräuchte.
Ich finde eriks Idee immer besser.Ich bin mir gerade nicht sicher ob du das ironisch oder ernst meinst

Swapping habe ich noch nicht, aber recht hast du trotzdem, hatte mal mit dem Gedanken gespielt lazy mapping im Kernel zuzulassen.Ich sage ja nicht, dass du das im Kernel benutzen willst. Ich widerspreche nur der Behauptung, dass eine Exception immer ein Fehler ist. tyndur plant Exceptions an ein paar Stellen fest ein, aber die sind auch alle nur für Userspace.
Aber Swapping möchte ich im Kernel sowieso nicht haben.
Hm, der Smiley verunsichert mich. Meinst du das jetzt ironisch oder ernst?Zitat von: porkchickenIch finde eriks Idee immer besser.Ich bin mir gerade nicht sicher ob du das ironisch oder ernst meinst

Ich widerspreche nur der Behauptung, dass eine Exception immer ein Fehler ist.Doch

Für mich ist etwas kein Fehler, wenn es normaler Teil des Programmablaufs ist.Denn das Problem ist, wie kann ich zw. nem richtigen NMI und ner IPI-Nachricht unterscheiden?Sollte man im local APIC nicht rausbekommen ob er den NMI ausgelöst hat?
Also muss er immer die Segment Register neuladen.Das sollten vielleicht alle Expection-Handler (Vectoren 0x00...0x1F) machen. Bremst ja nicht die Performance vom Syscall und dem Context-Switch-IRQ aus und um die geht es doch.
weil alle Exceptions und Interrupts aus dem Virtual-8086 Mode mit genullten Segment Registern im Kernel ankommen.Hm, das wusste ich nicht, ich hab mich auch nie mit dem VM86 beschäftigt. Das ist schon eine gewisse Einschränkung.
Weil diese Exception könnte auftreten, während ein Lock gehalten wird.Nicht wenn man dafür sorgt das noch relativ am Anfang der Assembler-Interrupt-Stubs DS und ES verwendet werden (einfach bei 2 Speicherzugriffen passende Präfixe benutzen) , FS und GS sind erst mal egal weil der vom Compiler erzeugte Kernel-Code die wohl nie benutzen wird.
und dass das die einzige Möglichkeit ist, im Exception Handler festzustellen, welcher Task der Verursacher der Exception war.Die selbe Lösung wie zuvor.
Ich finde eriks Idee immer besser.Meinst Du das ernst? (ja, ich meine meine Frage ernst und benutze hier absichtlich kein Smiley)