Im TSS muss man CR3 nicht eintragen (siehe die letzten Posts).
CR3 wird bei einem Interrupt nie geändert - egal ob Software oder Hardwaretasking.
Du mappst einfach den Kernelstack jedes Threads in jeden Prozess. (Der Kernel ist ja normalerweise eh in alle Prozesse gemappt). Dann kannst du ganz einfach das CR3 ändern indem du "mov eax, [deine_thread_struktur + offset des cr3 registers]" und "mov cr3, eax" machst. Du kannst natürlich auch CR3 immer auf den Taskstack pushen und dann popen, ich mache das aber nicht, weil bei mir nicht alle Tasks unterschiedliche CR3s haben (ein CR3 Switch kostet einige Hundert P4 Taskzyklen)