2026-08-15
セキュキャン OS自作ゼミ 参加記
セキュリティ・キャンプ2026 全国大会のY1「OS自作ゼミ」に参加しました。
OS自作ゼミの概要
- 講師: hikaliumさん
- チューター: バトルプログラマー見習いいちごさん
- ゼミ受講生: masuiさん、筆者
というメンバーでOSを作っていくゼミである。公式の講義概要にもある通り、受講生それぞれの興味や希望に合わせて、作るOSや実装する機能を決めることができる。 各々が作りたいものを作る、というゼミで、私は講師の方が書いた書籍『[作って学ぶ]OSのしくみⅠ』で扱われているwasabiの機能拡張を行った。 おおよそ週に一回ミーティングを行い、その中では進捗確認をしていただいたうえで次回までの目標を定める、というフローを8回繰り返したうえでキャンプ本番を迎えることとなった。
事前学習
初回
初回のミーティングでは顔合わせと、目標設定が開始された。 当初から、応募時の事前課題にもある通り、wasabiの拡張を行うことを考えていた。これは
- そもそもOSを0から設計するのは自分の手に余りそう
- ドライバを実装するのも同じく手に余りそう
- 書き込み処理は何をどうしていいのかわからない(同時に書き込んだときとか…)
といった背景から設定された目標である。
より詳細には
- FAT32、読み出しのみ
- ブートローダがBlock I/O Protocolを使用して、ボリューム情報をメモリ上に読み出す。FATの解釈は自分で実装する
というものを考えており、その旨を話したところ、講師、チューターの方におおむね以下のような指摘を受けた。
- FAT32は意外とややこしいがこの形式であることにこだわりはあるのか?
- 現実的になりすぎなくてもよいのでは?
これを受け、改めて作りたいOSを考えてくることとなった。
目標設定
これを受け、最終的に自分が設定した目標は
- 自作FTP風プロトコルで動作するファイル共有サーバー機能搭載OS
である。ファイルシステムに関して、とにかく最小限であるものにしようと考えた。何種か比較検討し、ジャーナリングや、ハードウェアの事情への考慮といった複雑な要素がなくシンプルな Minix FS を実装することに決定した。
上記の目標を立てた時点では実に挑戦的な目標だと思っていた。またセキュキャンに行った同期からは大体終わらなくてキャンプ最終日は徹夜することになると聞いており、徹夜は嫌だなあなどと考えていた。
FSの実装
いよいよ実装に入った。FATは「File Allocation Table」という正式名称が示す通り、ファイルが使用するクラスタのつながりをテーブル上のリンクとして管理する。一方、今回実装したMinix FSやext系など多くのファイルシステムでは、inodeにファイルのメタデータとデータブロックへの参照を保持する。この違いにより少し考えることが多く、また、当初参考にしようとしていた『ゼロからのOS自作入門』を直接的に参照しづらくなった。
当初目標にしていたオンメモリのreadは、事前学習の第三週、つまりファイルシステムの実装開始から約一週間後には、特に大きなつまずきなく作成できたため驚いた記憶がある。
最終的に、主にファイルサイズの制限はあるものの、ファイル/ディレクトリに対して読み書き削除を行えるようになった。
システムコールの実装
wasabiには姉妹本の『[作って学ぶ]ブラウザのしくみ』があり、簡易的なシェルとカーネル上での通信が実装されていた。 そのため、ドライバやプロトコルスタック自体は書かずともよいのだが、サーバーを開くのに必要なシステムコールは実装されていなかった。
真面目に実装しようと思うといくらでも真面目に実装できるため色々考えていたのだが、今後実装したいものを考えるとごく限られた機能(例えば、複数クライアントから同時接続されることはない)があれば良いため、Linuxカーネルにおけるbind + listen + acceptから必要な機能だけ抜粋して、一つのシステムコールにまとめたものを作成した。
これは汎用OSを作りたいのであれば、当然あまり良い判断ではないが、今回はセキュキャンという時間的ゴールが定まっていたため、このような「割り切った」設計を行っている。
本番
初日は基本的に座学でセキュリティに関する講義を受けた。法律の話は大変難しく、登大遊さんがコンピュータサイエンス専攻を修了したあと、法学を学んでいる理由が身をもって理解できた。また、セキスペを取ろうと思わされた。
二日目から四日目が本題の開発を行う期間であった。
二日目
二日目は、ある程度この3日間で何を実装するか決めた後、ファイルシステムに関するシステムコール実装の仕上げを行った。readをつつがなく作成したあたりで、openシステムコールが必要などと考えていたところ、ちょうど食事の時間になった。Linuxにおけるopenはなんでもやりすぎで、後方互換のためにこうなっているのだ、という話を聞いた。そこから、過去のものは新しい技術を想定した作りになっていないことに起因する困りごとは多いという話も派生した。
結局のところ、openという概念も不要であると判断し、ファイルを作るためのシステムコールとしてcreate、read、writeを作成した。
この日はLT会があったので、その準備も行った。 LTの内容は、事前学習中に講師から私のwasabiへの実装への指摘を受けて気づいた内容で、LinuxにおけるMinix FSの実装はビッグエンディアンを想定できていないということをWiiを用いて実証するといったものだった。
PCの端子が壊れているのか、驚異のスライドなしLTで、しかもUSB端子が壊れているのかWiiで作ったファイルを普通のPCに持ってくるのに難があり、後半の実証パートを講師にやっていただくという二重にめちゃくちゃのLTになった。 それでも後日おもしろかったと話しかけてくれた人が複数人いたので、テーマ選定が良かったのだと思う。
三日目
三日目はファイルのサーバーとしての機能を実装した。自作OSに載せない側であるクライアント側は以前に学校で作ったものを思った以上にそのままの形で流用できたため、想定より早く機能の大枠は完成することができた。そこで、ファイルのみならずファイルシステムのイメージ全体をサーバー側から送信する処理を追加した。
この結果、wasabiで自作したイメージをLinux側でマウントすることに難があることがわかった。ここで、inode中の値の更新にミスがありそうだったため修正したところ、マウントは早期にできるようになった。しかし、マウントしたあとにls -laしてもルート以下に何も入っていないように見える(本来であれば、.と..は絶対に表示されるはず)という問題が新たに起きた。
特に間違っている点は見当たらなかったため、う〜んという顔をしていたところ講師の方から、Linux側で作ったもののダンプと自作OS側で作成したもののダンプを比較すると原因が突き止めやすくなる、という指摘を受けた。それを受けてう〜んとダンプを見比べたところ、最終的にはいくつかファイルサイズの更新処理が不足していたという結論になり、無事にマウントして中身を正しく見るということができた。
四日目
四日目は午前中に少しデバッグを進めたあと、発表会となった。この直前に割り込みが何度か入ったことで、未完成のスライドで発表を行うこととなった。自分は短時間で準備するのは無理だとわかったが、アドリブで話してとりあえず会の進行を止めないことは可能であることがわかり、怪我の功名(?)である。
また、NOCにコーヒーを頼んだところ、大変おいしいコーヒーを届けていただいた。ありがとうございます。

学び
まず、「OS自作」という観点について説明する。
開発を行う上でLinuxを筆頭に既存のコードが公開されているOSを大いに参考にしており、コードリーディングを通じて多くの知識を得た。 この知識を得たことで、OSの存在意義である「抽象化と資源の分配」を再確認することにもつながった。
また、設計思想的なものの価値としては、上記記事で触れた大変機能が少ないシステムコールは今回においては汎用的な多機能さは必要ない、という割り切りの結果であり、ある種の設計と言える。このような”設計”はAIが毛量跋扈する現代において人間にしか作れない価値であり、また、純粋に現在必要なもの、実装力、将来の拡張も考えて最適なものを考えるのは楽しい。
他に、キャンプという機会で得たものも多い。
属しているコミュニティに技術的に優れている人間が非常に多いことや元来の性格もあり、自身の能力を過度に低く感じる思考をしやすくなっていた。キャンプを通して、講師やチューターの方にはポジティブな声掛けを多く受けたことや、自身でもともと思っていた自身の能力以上に大きなものを実装できたため、自信につながった。
また、興味を持ったことはやってみると良い、言葉を変えると能力不足と感じたとて、やったほうがよいのだ、ということがわかった。 これに関しては論拠が二つあり、一つ目には案外できるということ、二つ目には応募系のものは取り組むことで自身の能力が向上するし、運などが味方すると受かるので一石二鳥ということだ。
反省
大変学びの多いキャンプであった一方、反省点もある。
まず、他の人がやっていることをあまり見に行けなかった。 原因としては
- 自分のゼミの時間を減らしたくなかった
- 自身が知らない分野に関しては話を広げようとするのが難しかった
- もともとOS自作に興味があった人からは、いきなりさまざまなことを理解している前提で話を振られることが多く困った
- 元来敢えて他人と交流を持とうとする必要はないと考えている
などがある。 最後に関しては経験則に由来するので変える必要はないと勝手に思っているが、それ以外の事由の改善としては、つまり、わからないので最初から教えてください、ということを上手に言えるようになる必要があると思った。
また、今思えば計画時に(残り時間に対し)挑戦的だと思ったことも実装できたのではないかと思う。 具体的には、もっと大きなファイルサイズに対応することや、TCP通信周りの実装や機能の拡充、テストの完成などが挙げられる。 他に、ドライバの実装も最初から挑戦する前提で時間配分すればできたのかもしれない。(そういえば、最初の発案時点ではネットワークも自力でなどと考えていたような…)
どれも一度は考えた機能なのだが、時間的にこれを実装すると尻切れトンボになるかもと尻込みしていた。この結果、最終日は小さめの機能を実装していたのだが、バグで壊れたとしてもコミットを巻き戻せばデモはできるため、やればよかったと思う。
今後の目標、現在の興味
短期的にはまず、wasabi本をなんと(!)完了していないので完了する必要がある。また、家に破壊していいPCはあるのでぜひとも実機で起動させたい。
それから、OS全体を自身で自作したい。自作することは過去の資産を参考にするということでもあり、それを通じて理解できるものは多いと思う。今のところはwasabi本で扱ってない場所、扱っていても写経気味になっていたところがどのような原理で動いているのか知りたいという思いが強いが、そのうち局所的な用途で最適な謎OSなら作れたりするのだろうか…?
キャンプの中ではなるべくLLMに最初から書かせることをしないようにしていたが、実装をLLMに投げて時短する前提でなら達成できるのではないかと思う。
他に、キャンプ中を起点にして興味を持ったことに
- CPU自作 (命令セットの概念から)
- ネットワーク (CDN自作とNOCを横目で眺めていた)
- CTF (競技としてはほぼ興味なしだが、攻撃する視点に立つのは面白い)
- 言語処理系自作 (直接的には扱っていないが、これがあると自作OS上で開発ができるという主張や、本格的なシェルの実装ができたりする。同期が昨年度のCコンパイラゼミだった、など)
- アルゴリズム(同じく直接的には扱っていないが、実装力の足回りを固めたいと感じた)
などがある。いつやるのか、本当にやるのかもわからないが必要を強く感じたものや手をつけられそうなものからつけていこうと思う。
おわりに
事前学習から通して指導してくださった 講師の hikalium さん、チューターの バトルプログラマー見習いいちご さん、また 同じ受講生として異なる視点からOSを考える機会をくださった masui さん、またセキュリティ・キャンプ全体を支えてくださったセキュリティ・キャンプ協議会の皆様に感謝申し上げます。
比較的どうでもいい類の感想
- 徹夜せずに住んでよかった
- 体力がないので、時間配分以上に体力配分に気を配る必要があるとわかった
- 焦って勢いで締め切り駆動するのも向いていないことがわかった
- 「キャンプ」は4泊5日だが、帰宅するだけの六日目があるので、着替えが一着足りず、慌てて洗剤を調達するハメになった
- 食事は大変美味しく、ホテルもきれいで良かった
- あげたアヒルちゃんはかわいがってもらえているようでよかった