Will have to vary with what features you want.
The time tends to be taken
Supporting weird and wonderful hardware that might be plugged into a given system. If your system does not have anything and is all soldered as one (quite possible -- see most "embedded systems" ever) then you dodge that bullet.
Providing means of accessing things so the program authors for your system. Having Johnny just about fumbled through Java school having to write an entire TCP-IP stack to have a little application upload the results to a website is not going to end well. Don't have TCPIP or are willing to say "you do it" to your devs... makes life easier.
Supporting multiple programs. In X86 world this would be real vs protected modes, though there are quirks like TSR aka terminate and stay resident and the option to chain things together by writing to storage between things. Virtual memory, isolated memory, kernel vs user space, and the like, especially if the base hardware does not support it, then making things fun.
Possibly extending functionality of the system. For instance if the system does not support floating point you then do a software implementation of it. Normally in embedded systems this is the job of the BIOS or maybe a firmware but if playing OS dev this is also within your purview.
Supporting some of the more exotic program formats.
Microsoft's PE format (hence tools like PE explorer that pull apart Windows programs and dlls) normally seen in exe and dll, though stuff like xex and xbe for the various members of the xbox family might be familiar if you have knocked around this sort of site for a while is probably what most use. In Linux world and other aspects of homebrew world then ELF is what most would be looking at.
https://linuxhint.com/understanding_elf_file_format/
Making a robust API to allow programs to do their job. Kick it all to the program dev and you spare yourself some hassle.
Linux or BSD is where most would look to do anything practical, though I could see some of the Windows kernel stuff in the various reimplementations of it (see ReactOS for but one example
https://reactos.org/). If you are doing it to understand something more then might instead be worth looking at minix
https://www.minix3.org/ )
More generally if you have ever played ROM hacker for a system and are used to pulling data from various memory addresses, or have otherwise coded in assembly you could probably get some useful experience in something by playing around. If you have not done any of that you might want to start out playing with some assembly (
https://www.plantation-productions.com/Webster/ https://stuff.pypt.lt/ggt80x86a/asm1.htm ).