osdev-jpでは、OS開発に有用な情報を収集し公開しています

View My GitHub Profile

セキュリティ・キャンプ全国大会2023 OS自作ゼミ

このページはセキュリティ・キャンプ全国大会 2023の集中コース「OS自作ゼミ」の紹介ページと、課題で重視するポイントをまとめたページです。

おしらせ (2023-05-11)

応募を考えてくださっている皆様、本ページの公開が遅れてしまって誠に申し訳ありません。

既に課題を提出してしまった方でも、再提出は可能ですのでこのページを見て修正したくなった場合は是非再提出して貰えればと思います。 また、応募のエントリーと課題の回答期限は異なりますので、少しでも応募を考えていらっしゃる方は、まずエントリーを済ませてしまうことをおすすめします。

詳細については、公式ページの募集要項をご確認ください。 

OS自作とは

皆さん、OSを自作するのは、なんだか難しそうだと思っていませんか。 確かに現在広く使われているOSを一人で実装するのはとても難しいと思います。 ですが、機能を絞ったOSならば、皆さんも作ることができます。 講師の森も、Rustでx86_64とArm64(後者は実験的)で動くOS Methylenixを作っていますし、hikaliumもWasabiOSというx86_64向けのOSを個人で開発しています。

では、既に大規模なOSがあるのになぜOSを自作するのでしょうか。講師陣は、その意義について、以下のように考えています。

OS自作には、OSそれ自体に詳しくなるだけでなく、身の回りのシステムがどのように動いているのか、その裏側を知る手助けになったり、システムソフトウェアの設計方法や、低レイヤを意識したセキュアなプログラミング力が身につくなど、実利的な面でも良い事がたくさんあります。また、一見すると巨大で複雑で、とても自分の手に負えないように見えてしまうOSのようなシステムであっても、実はそれぞれの部分は意外と単純で、そのようなものの積み重ねの上に現代のコンピューターシステムは出来上がっているのだという、ある種の安心感も得ることができるかもしれません。 もちろん、低レイヤーのプログラミングは、自分ですべてを組み立てられるから楽しい!と思って、OS自作を続けている人もいます(そうです、我々もその一員です!)

世の中には、このようにそれぞれの様々な理由でOS自作を楽しんでいる人がいます。そして、それぞれの自作OSには、開発者それぞれのこだわりや、そのOSにしかない特徴が沢山あります。 OS自作ゼミに参加する皆さんには是非、自作OSの楽しさを実感してもらいたいと思います。

OS自作ゼミに参加したいけど、作ったことがない、うまくできるか不安、という人も、心配は不要です! OS自作は確かに難しいですが、一歩一歩コツコツやればどんどんできるものです。 講師の森自身、セキュリティキャンプ2017に受講者として参加したときは、OS自作に挫折してました。 ただ、キャンプ参加を機に一からやり直しました。 キャンプ中では起動してきてキーボードから割り込みを受け取るところまで実装するのが限界でした。 (詳しくは OS自作ゼミ参加記を見てください。)

OS自作の本を読んで、続きを作るのに苦戦している人や、挫折しかけている人も 「ゼロからのOS自作入門」を読み終えた方へ を読んでみてください。 これを読んで「もっとOS自作をやりたい」「もう一度やり直してみたい」と思った人は、課題の自由記述欄に書き込んでもらえればと思います。

OS自作ゼミについて

OS自作ゼミは2人の講師が担当します。

森は、RustでのOS自作をやっており、x86_64以外にもArm64の知識があります。またページングやメモリ管理の実装に凝ったり、ACPIのAMLのインタープリタを作ったりと、デバイスやリソースをしっかりと管理して、最大限活用したOSを作る事に興味があります。同じような興味がある人は是非一緒にOS自作を行いたいと思います。言語はRustでなくともC/C++でも大丈夫です。

hikaliumは大学で、不揮発性メインメモリ(NVDIMM)を用いた実験的な機能を自作OSに実装して研究をしていました。現在は、簡易的なWebブラウザが動作するような、プロトコルスタックやGUIを備えたOSを最近は自作しています。主にx86アーキテクチャをターゲットとしていますが、その他ARMやRISC-V上で動作するOSの開発を知識面でサポートしたり、各種ボード等の実験環境の提供も可能な範囲でお手伝いします。また、現在はChromiumOSの開発に従事しているため、Linuxカーネル関連のことや、Chromebookを開発環境やテスト環境として利用する方法についてもアドバイスできると思います。現在はRustを主に利用していますが、C/C++やアセンブリ言語でOSを開発したいという方でも大丈夫です。

どちらの講師が良いか分からない、という時は選択課題は解きやすい方を解いてもらって、自由記述欄にその旨を書いていただければ、こちらで適宜考慮します。

応募課題で重視すること

ここでは応募課題を採点するにあたって重視する点を説明します。

応募課題の実際の文章については 公式ページの応募課題 を参照してください。

A: OS自作ゼミで挑戦してみたいことについて

ここではOS自作ゼミで実装したい事を述べてください。 一からOSを作りたい人は、その旨を書いてもらっても大丈夫ですが、どのようなOSを作りたいのか、具体的に記述してください。 いずれにせよ大事なのは、その機能を実装する際に必要なものは何なのかを調査してみて、それを言葉にしてみることです。 「こんな機能を作りたい!!」と頭の中で思っているだけでは、どう実装すべきか明確になっておらず、あっという間に時間が過ぎてしまいがちです。質問をしようにも、ある程度の事前知識がなければ、なかなか難しくなってしまいます。 ということで、みなさんが実装したい機能を、どのように実装するのか、その準備に必要なのは何なのかなどをできる範囲で調べてみて、それを言葉にしてみてください。 また、実際に手を動かしてみて、わかったことを書いてみるのもひとつの手かもしれません。

B: ストレージの読み書きについて

ファイルの読み書きの背後には、実は多くの処理が走っています。 例えばC言語では、すでにライブラリに用意されているread/write関数を呼び出すだけでファイルの読み書きを実現できます。 しかし、実際にファイルを保存する際には、保存先のデバイスが何か、ファイルシステムは何か、他のプログラムが同じファイルに対して書き込もうとしてないか等々、考える事がたくさんあります。 これらを普段気にせずに済んでいるのは、OSがそれらをやってくれているからです。 では、具体的にアプリケーションから読み書きするときにOS内ではどのような処理が走っているのか、どうしてOSがそれをやるのか、OSがそれらの処理を行うことのメリットデメリットなどを述べてください。 実際のOSで実装されているファイル読み書き関数や、その内部実装を調べて書いてみるとなお良いでしょう。

C: プロセススケジューラの実装

この課題は、皆さんの基礎的なプログラミング能力を確認するためのものです。 最初はコードの綺麗さなどの見た目よりも、まず正しく動くものを作ってみてください。 その上で、コードを最適化したり、より高速に動作するように修正してみてください。 頑張って修正したところや見どころなどあれば、コメントとして書いてもらえるととてもいいと思います。 また、課題で実装するスケジューラーには、改善の余地がたくさんあります。余裕があれば、既存のOSの実装や自身の経験を元に、何が改善できるかについても述べてください。

D: CPUアーキテクチャの違いなど

この課題では、既存のOSが様々なアーキテクチャに対応するためにどのような実装をしているか観察し、それに対する考察を述べてください。 たとえば、LinuxやBSD系列のOSは、CPUアーキテクチャに対応しています。 CPUには様々な独自の機能が搭載されていますが、中には共通の機能もあります。 例えば仮想記憶のページングなどは現代のモダンPCを実現するうえでは必要不可欠となっており、x86_64やArm64、RISC-Vにおいて実装されています。 しかし、実際のページングの実装はCPUアーキテクチャによって似たような機能を実現するための手法が異なっているなどさまざまな違いがあります。 そのため、一つの実装では全てのCPUに対応することはできません。したがって、各CPU用の異なる実装を載せているのですが、OSのメモリ管理の機構からは統一的にこれらを操作できるようにしてあります。 このページングを統一して操作するレイヤーの実装があるのですが、これがLinuxとBSD系列では異なっています。 そこで、どこがどう異なっているのか、どうして異なるのかなどを調べたり考察してみたりしてください。 他にもx86_64のCPUが持っていた命令がArm64ではないが同等の操作をどう実現しているのか、同じCPUアーキテクチャでも世代によって異なる機能の差をどう吸収していたり、新機能に対応しているのかなどを検討してみるといいかもしれません。 また、多くのOSのソースコードには”arch/”というディレクトリが存在しており、中にはCPUやデバイス依存のコードが入っています、 ここに入れるべきコードとは何なのか、ここに入れるべきコードは多い方がいいのか、などを述べてください。

ここまでに述べたことは、非常に難しいことで私自身も完全に理解しているわけではありません。 完璧な回答は求めてないので、自分なりに調べて書いてみてください。私の開発しているOSを見て「こういう設計の仕方をしているんだな」と自分なりに要約してもらっても構いません。アーキテクチャの違いや進化によるマルチアーキテクチャ対応のOS自作の難しさを述べてもらえると良いです。

E: OSレベルでの脆弱性やセキュリティについて

この課題では、コンピューターやサイバー空間のセキュリティの向上に、OSがどのように貢献できるかをみなさんに考えていただくために設定しました。セキュリティ・キャンプでは、様々なレイヤーをカバーする数多くの講義が設定されていますが、その中でもOS自作ゼミは、ソフトウエアの中では最下層、全体で見ても低レイヤーに相当する内容を扱っています。コンピューターの世界では、上のレイヤは一般的に下のレイヤを「信頼できるもの」として扱っていますが、昨今は、その「信頼できる」と思われていた低いレイヤに潜むバグが世間を騒がせることが増えています。このような低レイヤに巣食う脆弱性は、発見が難しかったり、発見されても修正や対応が困難だったり、修正によってパフォーマンスの低下が起きたりといった問題が発生してしまいがちです。そのような問題を、比較的容易に変更が可能な「ソフトウエア」の中でも最下層に位置するOSのレイヤで解決・予防する方法について、あなたの考えや、調べてみてわかったことを述べてみてください。このような視点も、OSを自作する上では役立つことがあります。

F: 自由記述

ここでは、あなたの熱意やOS自作の経験、その他講師陣に伝えたい事を記述してください。 これまでに皆さんが書いたコードのリポジトリやブログ記事へのリンクなど、OS自作にかける熱い想いを存分に書いていただければと思います。 ここに書かれた内容で減点することはありませんので、些細なことでも、ためらわずに書いてください。

おわりに

長々と書きましたが、一番大事なのは、OS自作にかける熱い想いです。 OS自作に少しでも興味がある方は、ぜひ応募してみてください。

皆さんからの御応募、お待ちしております!!