当時の開発ログを見返しながらのメモ。
7/2、p-kernel の芯を micro T-Kernel 2.0 から μT-Kernel 3.0 に丸ごと載せ替えた。
3.0 は IEEE 2050 として国際標準になった版で、TRON フォーラムがソースを公開している。
■やり方
公開ソースを手を加えずにそのまま取り込んで、p-kernel 側の変更は上に小さなパッチとして重ねる。あとで上流と見比べやすいように。
移す順番はデバッグしやすいところから。
Linux 上のプロセス版(x86-64)→ Linux 上の ARM 版 → x86 ベアメタル → ARM ベアメタル。全部そろったところで 2.0 を削除。
■LP64 の罠
最初の Linux 版でいきなりスタックが壊れた。
原因は 3.0 の memset。unsigned long 単位で書き込んでいるのに、残りの長さは4ずつしか減らしていない。
μT-Kernel はもともと32ビットマイコン向けなので unsigned long は4バイトで問題ないけど、64ビットの Linux だと8バイト。頼んだ量の約2倍を塗りつぶして、呼び出し元のスタックを壊していた。
ポインタを32ビットの型に変換して上半分が消えている箇所もいくつかあったので一緒に修正。
■ほかにも
・x86 版:タイマ割り込みがいつまでたっても来ない。割り込みマスクを外す関数は引数をレジスタで受け取るのに、呼ぶ側はスタックで渡す宣言になっていて空振りしていた
・ARM 版:4バイトの変数に8バイトのゼロを書いて、隣の変数まで消していた。これは自分たちのコードに前からあったバグ
■脳の部分は差分ゼロ
最終的な変更は702ファイル。分散して動く脳の部分(arch/common)は1行も変わっていない。
わざと変えたのは1つだけ。crown の確認に使っているカーネル本体の機械語は、芯が変わったので当然変わる。新しい値を4回別々にビルドして同じになるのを確かめてから基準を更新した。crown をわざと更新したのはこれが初めて。
取り込む直前にもう1つ。「全4ターゲット通過」のはずが、新しい GCC(14以降)だとエラーになる箇所が3つあった。古いコンパイラでしか確かめていなかった…
■後日談
8月、x86 版がまた時々落ちていることが判明。
6月に苦労して入れた kill 対策(タイマの修正など)が、2.0 のファイルと一緒に消えていた。修正を 2.0 側に直接書いていたので、2.0 を消したときに道連れに。3.0 の作りに合わせて入れ直した。
※リポジトリ: https://github.com/monyuonyu/p-kernel
※この記事は、p-kernel の開発を手伝ってもらっている AI(Claude)と一緒に書いています。