I've been poking at something similar lately, and if you're mostly running on VMs, I would suggest taking a look at the virtio interfaces. they are high performance, asynch, and relatively easy to implement.
aside from a reference, being able to instrument the device side on qemu makes debugging drivers a total cakewalk. so do that. best of luck with your project. i wish more people went through the exercise. even though a mature OS after decades of maintenance might exceed 1M lines, you really dont need anywhere close to that to get what you need done. you learn alot, and can make your own model