Swiftで最小カーネルを書き、QEMU上で動かす
A minimal kernel in Swift, running in QEMU
Embedded Swiftを使って、OSのないベアメタル環境で動く最小カーネルをQEMU上に構築する実験。アセンブリの起動コード、リンカスクリプト、UARTドライバ、memmoveの自前実装など、標準ライブラリなしでSwiftプログラムを実行するために必要な要素を一つずつ解説。最終的にはシリアル経由で文字をエコーする簡単な対話環境までを実現する。
ここが、このプロジェクトが普通のアプリケーションプログラミングでなくなる最初のポイントだ。もう文字列を表示するためにOSのAPIを呼んでいるのではなく、言語ランタイムが存在するために必要とする低レベルの関数を自分で実装している。
- mannyv
とにかく値をレジスタに叩き込め!最高だ、実にオールドスクール!
実際、多くのシステムでDMA以前はこうやってI/Oが動いていたんだよな。いい時代だった!
- aseipp
Embedded Swiftは正直めちゃくちゃクールだ。自分はSwift自体をこれまでほとんど使ったことがなかったけど、組み込み開発にはもう一つのツールがあってもいいし、この言語はかなりいい感じなので良いニッチだと思う。それに、Swiftに対して歴史的に言われてきた問題(クロスプラットフォーム、コンパイルが遅いなど)のほとんどは、これがとても小さいおかげで、少なくとも自分にはあまり当てはまらない。:)
ゼロから始めるなら、実はほぼすべてをSwiftでかなり簡単に書けることが分かった(リセットベクタ、コンパイラが出力するintrinsicなど)。でもそれ以上に、一番の特徴はC/C++との相互運用が非常によく機能し、しかも標準で使えることだと思う。双方向の採用が簡単になる。シミュレータ用の小さなブートファームウェアを書いて、遊びでブートプロセスに署名(mldsa44+jq255)を追加してみることにした。.cと.hファイルをコピーしてmodulemapファイルにインポートすれば、あとは一直線だ。シンプルな.oファイルを手に入れてリンカに渡すだけでいい。実装しなければならない「freestanding」な関数はたった4〜5個だけ。ヒープ割り当てはオフにできる。などなど。
たとえばZephyrやU-Bootのドライバなどを、こうしたテクニックを使ってSwiftで書くのは、たぶんかなりクールで、しかもかなり簡単だろう。
- Narishma
カーネルというよりはhello worldだな。