当時の開発ログを見返しながらのメモ。
7/5、p-kernel を Windows のネイティブな実行ファイル(.exe)としてビルドできるようになった。WSL ではなく、Windows そのものの上で動くプログラム。
ビルドは Linux 上で mingw-w64。3日前に載せ替えたばかりの μT-Kernel 3.0 に、Windows 用のターゲットを1つ追加。
■タスク切り替えは Fiber に任せた
Linux 版や x86 版では、タスク切り替えをアセンブラで手書きしている。
Windows には Fiber(切り替えを自分で決められる軽いスレッドのようなもの)があるので、タスク1つにつき Fiber を1つ作って、切り替えは SwitchToFiber を呼ぶだけ。スタックもレジスタも Windows が面倒を見るので、手書きのアセンブラが要らない。書かなければ間違えようもない。
困ったのは、Fiber は自分自身の再開位置を書き換えられないこと。タスクを最初からやり直すときは、古い Fiber をいったん「墓場」に置いてあとで消すようにした。
■最初の版は協調型
Linux 版はシグナルでタイマ割り込みの代わりをしているけど、Windows 版の最初の版にはそれが無い。タスクが自分から手放したときだけ切り替わる協調型。起動時にそのことを表示するようにした。
[win] cooperative scheduler (no preempt in v1)
ネットワークは、BSD ソケットの呼び出しを Winsock に読み替える薄いヘッダをかぶせて済ませた。脳の部分には触っていない。
■LLP64 の罠
64ビットの Linux だと long は8バイトだけど、64ビットの Windows だと4バイトのまま(LLP64)。
メモリを配る処理がポインタを long にしまっていたので、Windows ではポインタの上半分が消えていた。3日前に Linux で踏んだ64ビットの罠に、別の形でまた引っかかった…
ポインタと同じ幅の型を用意して修正。ほかの環境では今までと同じ型になるので、既存の版の機械語は1バイトも変わっていない。
■メモ
この日できたのは、正しい形式の .exe が作れるところまで。作業環境には Windows も wine も無かったので、起動するかは実機で確認が必要(とコミットにも書いてある)。
1週間後に「毎回 .exe がビルドできること」を自動テストの必須項目にした。ただ、起動の確認はまだしていない。次は実際の Windows で試したい。
※リポジトリ: https://github.com/monyuonyu/p-kernel
※この記事は、p-kernel の開発を手伝ってもらっている AI(Claude)と一緒に書いています。