セキュリティ・キャンプ全国大会2023 開発コース Y1【OS自作ゼミ】応募課題 「OS自作ゼミ」の応募課題は、3問の共通課題と、2問の選択課題、そして1問の任意課題から成ります。共通課題は当ゼミに応募する方は全員回答してください。選択課題は、後で示す通りに回答してください。回答は、ソースコードを除いて全体が4096字に収まるようにしてください。英数字や記号、改行文字も1文字とカウントします。複数の選択課題に回答する場合も字数制限は変わらないので、注意してください。 今年のOS自作ゼミは、2人の講師、森とhikaliumが皆さんをサポートします。講師それぞれ、ちょっとずつ得意分野が違います。どの講師のもとで学びたいかを考えて、学びたい講師に対応する選択課題に回答してください。選考に通過した場合、回答した選択課題に対応する講師の班に配属されます。選択課題は複数回答可能です。複数回答した場合の講師選択は講師側で決めるため、応募者は選べません。 課題に回答する際は、本講義の[選考のポイント]( https://osdev.jp/page/seccamp2023 )を読んで回答すると、より良い回答になるでしょう。回答作成にあたり文献やWebページを利用した場合は、適切に出典や引用元を明記してください。 ## A: 共通課題 OS自作ゼミで挑戦してみたいことを教えてください。また、それを実現するために必要となる実装や調査はどのようなものになるか、あなたの予想を教えてください。間違っていても大丈夫です。 トピック例: コンテキストスイッチやページング、ネットワーク通信の実装など。 もちろんこれ以外のトピックも歓迎します。講師によって得意分野が違いますので、それも踏まえて回答していただけると助かります。 ## B: 共通課題 ストレージ上のファイルに対する読み書きの機能をOSがアプリケーションに提供する上で、OS側で実装すべき処理と、その動作について具体的に説明してください。なお、OS側での処理はレイヤーごとに分けて説明すると回答しやすいかもしれません。 ## C: 共通課題 C言語で、以下の条件を満たすプロセススケジューラを実装してください。 プロセスは、`Process`構造体で表現されます。 プロセスID`pid`は、0より大きい整数です。 プロセスの実行に必要な時間は`remaining_time`で表現されます。これが0のプロセスは実行が完了しているとみなし、スケジュールしてはいけません。プロセスが1回スケジュールされるごとに、この数値は1減らされます。 優先度`priority`がより大きなプロセスを先にスケジュールするものとします。 優先度の同じプロセスが複数ある場合は、残り時間が小さいものから順に実行されるものとします。 スケジューリングは`schedule`関数で行います。この関数は、次に実行されるプロセスの`pid`を返します。もし、スケジュールすべきタスクがない場合には、0を返します。 解答の制約: - C言語の標準ライブラリのみを利用して実装してください。 - プログラムとテストケースのひな形ファイル`scheduler.c`をダウンロードして使ってください。 - 関数やテストケースを追加するのは構いませんが、最初に定義してあるテストケースだけは変更せず、それらがパス(成功)するようにプログラムを作ってください。 - 応募課題を提出する際は、みなさんが実装を追加した`scheduler.c`をフォームの添付ファイルとして追加して提出してください。 - 提出された`scheduler.c`の内容をそのままコンパイル&実行すると、すべてのテストケースにパスする状態で提出してください。テストケースにパスすると、`PASS`と表示されます。初期状態では`FAIL: Expected pid is 3, but actually 0.` と表示されますので、これを修正するのが課題です。 - 提供したひな形のソースコードには、改善できる点がいくつかあります。それについても指摘し、余裕があれば修正してその内容について説明してください。 ## 問D: 選択課題(森に教わりたい方は回答必須) 近年、PCに搭載されるCPUとして、x86_64に限らずARMなどの異なるアーキテクチャが採用される場合が増えてきています。またRISC-VのCPUを搭載した評価用ボードなども登場しています。CPUアーキテクチャの変化や多様化に伴って、OSにはどのような機能・変化が求められると思いますか?x86_64向けとARM向けの自作OSの違いなどを例に上げながら思いつく限り自由に述べてください。 ## 問E: 選択課題(hikaliumに教わりたい方は回答必須) 近年、OSの実装や、アーキテクチャ特有の事情に起因する脆弱性が次々と見つかり、世の中を騒がせています。その中には、とても長い期間誰にも気づかれずに潜んでいたバグ ( e.g. https://github.com/Markakd/CVE-2022-2588 ) や、たった数行のミスで発生したバグ (e.g. https://dirtypipe.cm4all.com/ ) 、アーキテクチャの根本にかかわるバグ (e.g. https://meltdownattack.com/ ) なども多くあります。OSのレイヤーにおいて、セキュリティを向上させるためにどのような対策をとることができると思いますか?実例や具体的なアイディアとともに、自由に語ってください。 ## F: 任意課題 その他、何かあれば自由に書いてください。これまでにあなたが行ってきた自作OSやシステムプログラミングに関連するリポジトリや、関連する活動へのリンク、OS自作へかける熱い想いなど、なんでもOKです。