Skip to content
Antonio Giacomelli edited this page Jul 7, 2026 · 376 revisions

RK0: The Real-Time Kernel '0'

"Every Universe of Discourse has its logical structure." (Langer, 1929)

“Real-time” has become a catch-all term, often used to describe online interactive or simply fast systems. However, this isn’t a correct definition. With so many loose terms, at least this one is solid:

A system is real-time if any of its responses must be completed within a guaranteed time frame, regardless of execution time, considering interference from other tasks, if it is concurrent.

So, if concurrency is already difficult, when you need to bind it to real-time responsiveness, you will eventually start asking yourself whether we have the right tools for the job. The crude answer is: we don't. Response time emerges from implementation. To increase our chances of getting it right, we need a simple mental model.


The Docbook provides design internals, rationale for design choices, some theory, and rich usage examples.

Whitepaper RK0 Design Rationale. Although written by an LLM after several iterations fed with the RK0 Documentation, it is concise and accurate enough.


Getting Acquainted

The Execution Image is a single-process. Roughly speaking, we enable concurrency within a single process by composing a thread of execution with a unique portion of the running stack. This composition gives us a schedulable unit, which we chose to call a Task. System Tasks and User Tasks have different stack pointers, but user tasks run privileged. The rationale for this choice is in the Docbook; to summarise, it is a choice of non-compromising analysability and responsiveness for the given target systems. The rationale behind this choice is detailed in the Docbook. Essentially, it’s about maintaining analysability and responsiveness given the target systems: constrained firms and hard real-time application-specific computers. (A version that splits the user space from the kernel space is under development.

RK0 design has a clear real-time model, summarised in the diagram below. Further details are available in the links above and the Service Semantics wiki. The main characteristic of the real-time model in RK0 can be summarised as: there is always a known reason for execution progress. This is the “0 surprises” guideline. This model is not a minor detail; it underpins every design decision.

RK0 Real-Time Model

3. Memory Model: Memory is mapped to the physical memory:

We are talking about CPUs in the range of 8-256 KiB of RAM. Application-specific needs for dynamic allocation and deallocation, as well as some kernel mechanisms, make use of an allocator that suits real-time demands: fixed-size blocks, word-aligned, O(1).

4. Programming with RK0:

Shared-state and message-passing are supported. You can stick to one or use both, as demonstrated on the application example.


Target applications (and non-target):

  • RK0 is a suitable system whose quality of service degrades quickly when not meeting time constraints. Tasks can't be unaware of each other and are actually cooperating concurrent units. The solution is domain-dependent. The hardware is domain-dependent. The deployed application was tested and is trusted. This is the typical closed model that most real-time critical applications fit.

  • It doesn't target any solution that until recently was handled by MMU-equipped, moderately powerful devices, running tailored full-fledged OSes (historically BSDs, until Linuxes prevailed); anything that faces it on the web, exposing to a high attack surface.


Every modular mechanism has a list of requirements identified by a unique ID, along with a unit test case.


Q&A

Q: Why is there no release yet?

A: A release is serious stuff. v1.0.0 will come when I can push:

  • a good Trace mechanism (it is ongoing)

  • can provide meaningful and honest system characterisation (it is ongoing)

  • the test harness in a way it works for any potential contributors (it works on my computer)

Clone this wiki locally