Irgendwo sitzt bei dir noch ein großes Missverständnis.
Ring-3-Code braucht gar keinen Zugriff auf den Kernel, Ring-0-Code braucht ihn. Du hast Ring-0-Code, der mit dem PD des Tasks läuft, also musst du in diesem PD alle Pages gemappt haben, die dieser Ring-0-Code benutzt. Du musst das User-Bit für diese Pages aber nicht gesetzt haben, weil es ja schließlich Ring-0-Code ist, der auch auf Kernelpages zugreifen darf.
Ein Task sollte sich nicht durch return, sondern mit einem Syscall beenden. Wenn es das nicht tut, gibt es halt eine Exception und der Kernel entsorgt den Task...