I went a slightly different route

The project here is to emulate an Atari 8-bit, and an Atari ST/TT on a single Zynq (ARM+FPGA in one chip). The zynq 7020's are now pretty "old tech" and they're easily available but they're still pretty "high tech" compared to 1980's computers

To make it more authentic, I wanted a "switch on, <brief pause>, you're there", and I wanted control over the "brief pause" bit. Right now, I boot to a graphical desktop in ~2.5 secs, and 1.5 secs of that is my old 4K monitor syncing to the 1080p output.
The Zynq ships with two real options for an OS - linux or FreeRTOS, the easy option is just to go for linux, you get all the networking and display drivers built in, it "just works", but it fails my "switch on, <brief pause>, you're there" ready-to-go requirement. So I went with FreeRTOS
The basic idea is that you boot into a graphical desktop, can browse the filesystem (or Fujinet, a tftp-like internet-service, as if it were local) for 8-bit or 16-bit apps, and double-click to launch. That meant an underlying OS, hosted on the A9 core in the FPGA, vending services to the various emulators running as tasks (or hardware) - kind of like a hypervisor vending service out to the clients. There was one small wrinkle, I decided to make the A9 OS use an updated GEM as its graphical interface, which meant that "well behaved" 16-bit apps would just run on the desktop, not inside an emulator window.
The OS that eventually emerged from this was all built on top of the FreeRTOS kernel, extending it to allow:
- Shared libraries
- Dynamic linking of applications at runtime
- Memory protection
- Shared memory
- Virtual memory
- Networking, with BSD sockets
- Signals and job control
- A full /dev (block and character) and /proc interface
- Virtual filesystem interface (/tmp is ramfs, SD is fatfs)
- .. and probably a few things that escape me right now

On top of that base, I have sshd (dropbear) running and toybox (for unix-like utils) installed so I can ssh in/scp files, and there's a UDP mouse/keyboard redirect until the motherboard turns up for the Zynq module (a MyIR Z-Turn board) I'm using


It's actually pretty amazing what you can do with a little time and Claude code.