seccamp2018
このページはセキュリティキャンプ全国大会 2018 の集中開発コース「OS 開発ゼミ」の紹介ページです.
OS 開発ゼミ 基本情報
OS 開発ゼミの基本的な情報は以下の通りです。
- イベント:セキュリティキャンプ全国大会 2018
- コース:集中開発コース
- トラック:システムプログラミングトラック
- ゼミ:OS 開発ゼミ
- 時間帯:3 日間連続(8/15 - 8/17)
- 必要機材:PC、その他必要に応じて仕様書や参考書など
- 事前学習:あり(詳しくは後述)
- 講師:粟本さん,武内さん,内田
IPA の公式サイトはこちらです https://www.ipa.go.jp/jinzai/camp/2018/zenkoku2018_index.html
紹介動画
OS 開発ゼミを講師自ら紹介する動画を公開しております.是非ご覧ください.
OS 開発ゼミでやること
OS 開発ゼミではパソコン用のオリジナル OS を作ります.つまり,OS 自作をします!
そもそも「OS を作る」というのはどんなことでしょうか. このページを読んでいる皆さんはきっと,普段からパソコンは使っていることと思います. OS としては Windows,macOS,Linux のどれかではないでしょうか?(もしかしたら FreeBSD 派という方もいるかもしれませんね) そんなものを「作る」のは果たして可能なのだろうか,と思うかもしれません.
確かに現代のパソコン用 OS の規模はとても大きくなっていて,その規模のものを個人で作るのは無理です1. しかし「OS の骨格部分を作る」に限定すれば,そんなに無理な話ではありません. 12 年前に出版された「30 日でできる!OS 自作入門」では 30 章に分けて OS を 1 から作っています. ここで作る OS は規模は小さい2ですが,プロセス管理,メモリ管理,デバイスドライバなど,OS の基礎を学べます.
こんなにちゃんとしたパソコン用 OS が存在する現代において,「OS 自作」は何の役に立つのでしょうか. 筆者(内田)が考える OS 自作の良いところは次の 3 点です.
- 低レイヤプログラミングは楽しい
- 現代の OS がどうしてそういう実装になっているのか,経験的に学べる
- 低レイヤに詳しくなれる
1 は人によりますが,筆者は低レイヤプログラミングがとても好きです. 普通のアプリケーションを書いているだけではパソコンの中身を触ることはできませんが,OS を自作することでハードウェアを生で触ることができます. 筆者は,この「ハードウェアを自分の力で操ってる感」が楽しみで OS 自作をしています. ハードウェアを制御するドライバプログラムを書いているときが一番幸せです.
パソコンの中身を見てみると実にいろいろなハードウェアが搭載されています. グラフィックボード,PCI バス,USB コントローラ,タイマ,ストレージ,メモリ,などなど. 挙げたらキリがありません. 既存の OS を使うだけだとこの辺りのハードウェアを直接制御する機会はありませんが, OS 自作を通して自由自在にハードウェアを触る経験をしてみるのもいいんじゃないでしょうか.
また,OS は IT システムを構成する重要な要素です.しかし OS の中身を知らなくてもアプリケーションを開発できるため,多くの人にとっては OS が具体的に何をするかは謎ですし,謎のままでそんなに困っていないかもしれません.
しかし,性能を求めるソフトウェアシステムを構成したり,低レイヤ部分に原因がある問題を解析したりするためには OS についての深い知識が欠かせません.特にこのレイヤにセキュリティ脆弱性があると,単一のアプリーションにとどまらずシステム全体の安全を脅かします。2018 年頭から世間を賑わわせている Spectre & Meltdown はその代表例でしょう.多数の顧客が同一システムに載るクラウドサービスが全盛の現代では,低レイヤを深く知る重要性がより高まっていると言えます.
さて,一言で「OS 自作」と言っても方向性は多岐に渡ります. このゼミでは, 3 つのテーマ「最先端 OS 談義」「Linux 開発者を目指そう!」「フルスクラッチ OS を書こう!」をテーマに,それぞれ得意分野とする講師が担当します. 皆さんの熱意を,講師がバックアップします.
最先端 OS 談義
粟本が担当する「最先端 OS 談義」のテーマでは、OS に興味がある人向けに、「独創的な OS を自力で作れるだけの実力や思考回路をゼロから身につける」事を目的としています。
詳しくはこちらのブログ記事をお読みください。 http://raphine.hatenablog.com/entry/seccamp2018_overview
Linux 開発者を目指そう!
このテーマは武内が担当いたします。
このテーマでは既存、かつ世界で最も広く使われているOSカーネルであるLinuxカーネルの開発をします。本講義では既存のLinuxカーネルを改造してみなさんに独自の機能を追加していただきます。これによってカーネルとは何なのか、Linuxカーネル開発がどのようなものであるかを体感できて、世界が広がることでしょう。
Linuxカーネルの開発をするにあたっては大きな障壁がいくつもあります。以下はその例です。
本コースではキャンプ当日までの事前学習によってこの障壁を突破した上で本番の3日間で独自機能追加をしていただきます。
事前学習では次のようなことを学びます。
- 大規模ソースコードの読み方
- ソースコードのバージョン管理システムの使い方
- カーネル開発ルールの学習
- 単純なカーネルコードの追加方法
- 開発自動化ツールの使い方
事前学習においては本番に必要な最小限の知識のみを段階的に覚えられるように工夫しているため、全く知識がないかたも安心してください。これに加えて受講者のみなさまの前提知識を事前にヒアリングして、それをもとにさらに追加の学習項目を追加する予定です。
キャンプ本番では次のようなものを開発することを予定していますが、何かお好みのものがあれば変更もできます。
もし学業が忙しいなどの理由で事前学習が最後までたどり着かなかった場合も、本番で事前学習の続きに取り組むこともできます。自分のできるペースで、できるところまでやりましょう。
フルスクラッチ OS を書こう!
筆者(内田)が担当します.
このテーマでは OS をフルスクラッチで開発します.フルスクラッチとは,既存のものを改造するのではなく新規に作るという意味です.フルスクラッチですから,OS の起動部分から始まり,メモリ管理,プロセス管理,画面出力,キーボード・マウス入力などを一通り実装することになります.個人でもこれくらいは作れるという例を示します.
このスクリーンショットは「30 日でできる!OS 自作入門」という本で作る「はりぼて OS」の最終的な画面です.ウィンドウがぽこぽこ表示され,インベーダーゲームが動き,JPEG 写真が表示されています.日本語のテキストファイルも表示できますし,音楽だって鳴らせます.ただの見せかけで OS の機能がしょぼいかというとそうではなく,カーネルとアプリはちゃんと分離されていて,アプリからはシステムコールを叩いてカーネルの機能を呼び出す,というように割と本格的な仕組みになっています.これが出来合いの OS を改造しているわけではなく,すべて自分で実装しているのです.なんだか,自分でもできそうな気になってきませんか.
このテーマに興味がある方は「30 日でできる!OS 自作入門」とか「はじめての OS コードリーディング」などの OS 系の本を読んで実際に実装してみたいなと思っているかもしれませんし,もしかするとこのブログを読むまでは興味が無かったかもしれません(そういう方は是非,別記事も合わせて読んでください).もしかすると,OS は一通り実装したことがあって,発展的な改造をしたいなと思っている方もいるかもしれません.このテーマは,そのような思いを持つ方(初心者から上級者まで)が,実際に手を動かして実装を進めていく場を提供します.ずっと自作 OS の分野で活動してきた講師(筆者のことです)が隣にいますので,アイデアを議論したり,実装に詰まったときのお手伝いが可能です.
今まで OS を自作したことが無いけど,興味がある!という方は,別記事でちょっとした入門の話を書こうと思いますので,是非読んでみてください.
このテーマではキャンプ当日までの事前学習があります.事前学習ではキャンプでどんな OS を作るかを考えたり,それを実装するのに必要な資料を集めたり,実際に少しずつ開発を始めたりします.キャンプの 3 日間で最高の成果を出せるように事前準備がとても大事なのです.キャンプ当日の 3 日間よりも事前学習が本番だと言っても過言ではありません.
皆さんと OS の開発ができることを楽しみにしています.是非「OS 開発ゼミ」に応募してください!そして,テーマに応募していただける場合は,選択問題 S1 に必ず回答してくださいね.
-
講師の粟本さんが教育用に作った minimal linux は,最低限の動作だけするように Linux からコードをそぎ落としたものですが,それでも圧縮した状態で 15MB 程度のコード量です.ソースファイルは約 900 個あり,4 コア 8 スレッドのサーバー向け CPU を積んだマシンでビルドに 20 秒かかるようです.個人で書くのはとても難しい量です.↩
-
はりぼて OS の最終版 harib27f は,ドライバを含めたカーネル部分のソースコード行数は 4456 行,約 114KiB です.https://www.youtube.com/watch?v=DHRIY2LMcTM↩