Also, um dir folgen zu können ( ich weis ich stell mich manchmal ziemlich dumm an...) aber versuch ich jetzt noch mal aus meinem Verständnis das ganze zu beschreiben...
Ich hab den normalen Kernel-Stack erstmal. Wenn nun der Interrupt auftritt sicher die CPU ein paar Register (äh EIP, ESP usw. ??) von selbst, dann sicher ich ja im Assemblercode noch die Interrupt Nummer und bei Exceptions die Fehlernummer, die bei einem Timerinterrupt allerdings einfach null ist. So weit so gut. Dann push ich noch den aktuellen esp auf den Stack als Parameter für die Interuptbehandlungsfunktion... Die Sachen die ich jetzt auf dem Stack liegen habe, bilde ich ja mit der cpu struct ab. soweit richtig?!
Dann bin ich nun im Interrupt. Mein Scheduler holt den nächsten Task, der sagen wir jetzt mal ein Ring0 Task ist und der vorher war ein Userspace Task... nun trag ich im TSS bei esp0 den neuen Task ein und gehe ans ende dieser Struktur... so nun geb ich die Adresse des neuen Taskzustandes zurück. Setze den Stack-Pointer auf die neue Taskstruktur nehm noch den Fehlercode und die Interrupt nummer vom Stack, lade die Segmentregister neu und springe nun mit iret aus dem Interrupt. Das müsste doch dann meine Taskstruktur vom Stack nehmen und EIP (wie in deinem Beispiel jetzt auf 0x1000) liegen. Soweit wieder richtig?
Nun müsste doch der ESP = dem ESP im TSS sein... aber ab wann spielt den dann jetzt der ESP - Pointer im TSS eine Rolle. Ich hab grad einen Ringwechsel gemacht, aber was tut jetzt hier der ESP aus dem TSS, das hab ich irgendwie noch nicht ganz verstanden. Oder ich hab hier nur kompletten blödsinn geschrieben