RPC, the input stack, the graphics stack, the network stack, audio, profiling, telemetry, scheduling, UI toolkits, security, service management, application management, etc.
If you want to learn these things you will need to read the documentation and source code for other OSs.
But for beginner, I think xv6 is sufficient: https://github.com/mit-pdos/xv6-public
A rather small codebase, pretty well documented, easily buildable without building your own custom GCC, docker etc etc
Wishing x86 on students is sincerely such a sadistic act. Just pick an arbitrary isa that's easier to reason about (read: basically anything after 1990 not designed by intel) and stick to it.
There are also really good virtual machines and emulators available.
Most of the weirdness came in in the 286 and can be more or less ignored. The parts that can't be ignored happen mostly during initialization.
If you want to baby step your way towards assembler and hw programming, DOSBox + an IDE/debugger setup from the late 80's/early 90's is really not a bad combo. That could be Turbo/Borland Pascal or C(++) with Turbo Debugger and Turbo Assembler, for example. You get a running environment, you have direct access to the hardware (DOS won't stop you), you can access it from Pascal/C, you can use inline assembler in both, and you can use external assembly files if you want. You can even successfully single-step and use breakpoints a lot of the time.
A Raspberry Pi or similar is a good alternative. I don't think any non-ARM platform is.