Skip to main content

Building a ring-native OS with Claude

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

Popular posts from this blog

I'm not a passionate developer

A family friend of mine is an airlane pilot. A dream job for most, right? As a child, I certainly thought so. Now that I can have grown-up talks with him, I have discovered a more accurate description of his profession. He says that the truth about the job is that it is boring. To me, that is not that surprising. Airplanes are cool and all, but when you are in the middle of the Atlantic sitting next to the colleague you have been talking to past five years, how stimulating can that be? When he says the job is boring, it is not a bad kind of boring. It is a very specific boring. The "boring" you would want as a passenger. Uneventful.  Yet, he loves his job. According to him, an experienced pilot is most pleased when each and every tiny thing in the flight plan - goes according to plan. Passengers in the cabin of an expert pilot sit in the comfort of not even noticing who is flying. As someone employed in a field where being boring is not exactly in high demand, this sounds pro...

RocksDB data recovery

I recently needed to do some maintenance on a RocksDB key-value store. The task was simple enough, just delete some keys as the db served as a cache and did not contain any permanent data. I used the RocksDB cli administration tool ldb to erase the keys. After running a key scan with it, I got this error Failed: Corruption: Snappy not supported or corrupted Snappy compressed block contents So a damaged database. Fortunately, there's a tool to fix it, and after running it, I had access to the db via the admin tool. All the data was lost though. Adding and removing keys worked fine but all the old keys were gone. It turned out that the corrupted data was all the data there was. The recovery tool made a backup folder, and I recovered the data by taking the files from the backup folder and manually changing the CURRENT file to point to the old MANIFEST file which is apparently how RocksDB knows which sst (table) files to use. I could not access the data with the admin tool, ...

PydanticAI + evals + LiteLLM pipeline

I gave a tech talk at a Python meetup titled "Overengineering an LLM pipeline". It's based on my experiences of building production-grade stuff with LLMs I'm not sure how overengineered it actually turned out. Experimental would be a better term as it is using PydanticAI graphs library, which is in its very early stages as of writing this, although arguably already better than some of the pipeline libraries. Anyway, here is a link to it. It is a CLI poker app where you play one hand against an LLM. The LLM (theoretically) gets better with a self-correcting mechanism based on the evaluation score from another LLM. It uses the annotated past games as an additional context to potentially improve its decision-making. https://github.com/juho-y/archipylago-poker