I've hacked around in SerenityOS from time to time, mostly to familiarize myself with the basics of an operating system.
I've found the code incredibly readable. Even a simple web developer like myself can understand most things. It is not cluttered by macros and has limited CPU architecture support, which to me is a huge plus since it makes the codebase less intimidating.
Inspired by it, I wondered how hard it would be to build my own kernel. Well, it is hard of course, to make something actually useful, but what if i strictly focus on the basics?
Turns out, not too hard. With Claude that is.
I had a few ideas on what I would like to accomplish. Besides the kernel basics like your allocators, MMUs, interrupt handling, schedulers, I was really interested in learning one thing specifically. That is io_uring. I wanted to build a kernel that would largely avoid sync system calls and instead borrow the ideas from io_uring for all user-space I/O operations.
I also did not want to implement fork or execv. I wanted to spawn new processes via the ring, so creating new processes is async as well. I wanted to avoid creating system calls for as many operations as possible.
It turned out that, building this simple ring-based ABI was not too hard for Claude at all. It took one Saturday to build a reasonable version that had all of this working.
While Claude did all the typing, I wanted to stay very much in control and approve and understand every decision and design choice. Also in here, Claude was very useful. You can endlessly question it with detailed reasoning and explanations of common patterns.
I was also positively surprised how well Claude could write ARM64 instructions. It literally zero-shotted almost everything. Having said that, I kept the ARM developer guide nearby to make sure I was keeping track (well... at least I like to say that to myself) of what was going on. It did not do the copy_to_user quite right (failed to use STTRB unprivileged store, skipping permission check) but those were a few omissions I could clearly see were wrong. Of course, I am no kernel expert.
Not sure how much further I will go on with this. It is an extremely rewarding and interesting project to work on though. It feels genuinely surreal to build something very low-level with a coding agent. The layers of abstraction could not be further apart.
https://github.com/jjylik/jatuli

Comments
Post a Comment