自作OSを、Linuxの上で1つのプログラムとして動かしてみた

当時の開発ログを見返しながらのメモ。

2026-05-21、p-kernel が初めて Linux の上でふつうのプログラムとして起動した。

■ラズパイが買えなかった

前の日に ARM(aarch64)に移植したばかりで、次は Raspberry Pi 3B+ の実機で動かすつもりだった。
が、その月はラズパイを買う余裕がなかった。実機が無い。

そこで「Linux の上に寄生させて動かせないかな」とAIに相談。
Linux の中で Linux を動かす User-Mode Linux の p-kernel 版。これなら Linux を持っている人なら誰でも試せるし、Android の中身も Linux なのでスマホにもつながる。

そのとき打った一言がログにそのまま残っていた。

偉大な目標のため お願いします!

今読むとちょっと熱い…
名前は UMP(User-Mode p-kernel)。今の Linux 版・Android 版は全部ここから。結果的にはラズパイが買えなくてよかった。

■タスク切り替えはアセンブリで

ucontext を使えば楽だけど、POSIX で非推奨なので避けてアセンブリで書いた。aarch64 用で17命令。最初から2つのタスクが交互に動いた。

タイマー割り込みの代わりは 10ms ごとの SIGALRM。シグナルが来たときに、Linux が保存したレジスタ一式を別のタスクのものに書き換えておくと、シグナルから戻ったときには別のタスクになっている。

■止まった原因は2つ

T-Kernel 本体をつないだら起動の途中で止まった。

1. 割り込みを止める命令がベアメタル用の特権命令のままだった。ふつうのプログラムからは実行できないので見えないところで落ちていた。Linux 用はフラグを立てるだけの版に差し替え。
2. スタックが16バイト境界にそろっていなかった。aarch64 はそろってないとスタックに触った瞬間に落ちる。ベアメタルではたまたまそろっていただけ。

直したら出た。

[BOOT] Starting T-Kernel...
[T-Kernel] Initial task started
 p-kernel  [linux / aarch64 userspace]
  T-Kernel is alive inside a Linux process.

■x86_64 は一発

同じ日の夜に x86_64 版。aarch64 で踏んだ罠の直しが共通コードに入っていたので、最初のビルドでシェルのプロンプトまで来た。
(作業していたのは aarch64 の機械なので、確認は qemu-x86_64 越し)

■うれしいところ

1台の Linux で何個でも起動できる。同じ日のうちに2つ立ち上げて、SWIM でお互いを見つけるところまで確認。
実機を並べなくても分散の実験ができるのは大きい。

※リポジトリ: https://github.com/monyuonyu/p-kernel

※この記事は、p-kernel の開発を手伝ってもらっている AI(Claude)と一緒に書いています。

コメントを書く