Hallo,
man kann Code, der eine Emulation für atomare Instruktionen nutzt, nicht mit Code mischen, der dafür spezielle Instruktionen nutzt, weil beide Ansätze sich ausschließen. Das heißt, dass alle Bibliotheken und Anwendungen die Emulation benutzen müssen, um auf 80386 zu funktionieren, was für Linux-Distributionen irgendwie unpraktisch ist. Windows NT unterstützte übrigens Dual-386-Systeme.
Baut man für 80386, erzeugt der Compiler Code, der die fehlenden Instruktionen vermeidet. Baut man für 80486+, dann kann der Kernel die fehlenden Instruktionen zur Laufzeit emulieren, was aber nicht dazu kompatibel ist. Außerdem ist so eine Emulation auf dem 386er dann nicht SMP-tauglich.
Kurz: invlpg kann man im Kernel kompatibel durch ein mov cr3 ersetzen, compxchg nicht.
Gruß,
Svenska