On developing 64 bit x86 operating systems in macOS
Sometimes I want to work on my experimental operating system when I'm away from my Linux monsters. To that end I keep the ability to build it on macOS. Broadly speaking that means a qemu
built to support SDL because the Cocoa one in brew
hasn't worked in years.
But the wrinkle… you can't use the qemu -kernel xxx
flags with 64 bit multiboot kernels. It appears to be a "won't fix" from qemu, so I need to make ISO images, but making a working, modern grub
on macOS cross compiling from ARM is not anything the grub guys envisioned.
Note: You will find people using legacy grub with just an eltorito.bin. This won't work well for 64 bit x86, you have to relink to elf32 then your symbol entries are all in the wrong format and insanity ensues.
So this is how I tackle it:
-
Use
mkisofs
fromcdrtools
frombrew
to build the ISO image. -
Rip the guts out of an ISO I made on a Linux machine using grub and stuff those into my ISO.
If you mount an ISO you have made, you will find a boot/grub
directory. Take that and stick it into your ISO, add your own boot/grub/grub.cfg
, pack it all up and you are ready to go.
The relevant part of my Makefile looks a bit like this…
iso/boot/grub/grub.cfg : $(srcdir)/scripts/grub.cfg | iso/boot/grub
cp $< $@
iso/boot/grub/i386-pc/eltorito.img : $(srcdir)/scripts/grub.tar.gz | iso/boot/grub
tar -C iso/boot -xf $<
os.iso: iso/boot/kernel.elf iso/boot/grub/grub.cfg iso/boot/grub/i386-pc/eltorito.img
mkisofs -R -b boot/grub/i386-pc/eltorito.img -no-emul-boot -boot-load-size 4 -boot-info-table -o $@ iso
You've noticed I grabbed a grub.tar.gz
from someplace you can't see. I've added it as an attachment to this post. I'm using a single file (eltorito.img) as a proxy for the whole thing being unpacked. Don't fiddle with the pieces and expect make
to notice.