To build a small distro as a learning experience, I would suggest to use busybox (or toybox or tools from suckless.org, heirloom project...).
If you build a statically linked busybox with most of the options, you end up with all the tools needed to start an run a small distro. Busybox is easy to configure (make menuconfig, ...).
If you choose this way, building a small distro boils down to:
- Build a file hierarchy and create a few nodes in dev
- Compile and install a kernel
- Install a boot loader
- Compile and install busybox
- Create an init script
I'd suggest to build all of this in a disk image. A disk image can be mounted, chrooted in, ... AND in the end, you'll be able to boot your magnificent Linux distro
in a virtual machine (qemu, virtualbox, ...).
You can create a raw disk image with dd (or qemu-img). To mount it, the easiest way is to use 'losetup'. I you use qemu, you can use the raw image directly. With virtualbox, I'm not sure, but I think you would need to convert it first (there are tools to do that).
I don't have time to add much more on this, but I would suggest to look at
Pocket Linux. Interesting stuff I know of can be found with Alpine Linux, Aboriginal Linux, Morpheus Linux, Sabotage Linux, suckless.org and many more I forgot ...