uchan note

プログラミングや電子工作の話題を書きます

セキュリティキャンプ2019全国大会 OS開発ゼミ 紹介

このページはセキュリティキャンプ全国大会 2019 の集中開発コース「OS 開発ゼミ」の紹介ページです.

OS 開発ゼミ 基本情報

OS 開発ゼミの基本的な情報は以下の通りです。

  • イベント:セキュリティキャンプ全国大会 2019
  • コース:集中開発コース
  • トラック:システムプログラミングトラック
  • ゼミ:OS 開発ゼミ
  • 時間帯:3 日間連続(8/14 - 8/16)
  • 必要機材:PC、その他必要に応じて仕様書や参考書など
  • 事前学習:あり(詳しくは後述)
  • 講師:粟本さん,武内さん,西永さん,内田

IPA の公式サイトはこちらです https://www.ipa.go.jp/jinzai/camp/2019/zenkoku2019_index.html

OS 開発ゼミでやること

OS 開発ゼミではパソコン用のオリジナル OS を作ります.つまり,OS 自作をします!

そもそも「OS を作る」というのはどんなことでしょうか. このページを読んでいる皆さんはきっと,普段からパソコンは使っていることと思います. OS としては WindowsmacOSLinux のどれかではないでしょうか?(もしかしたら FreeBSD 派という方もいるかもしれませんね) そんなものを「作る」のは果たして可能なのだろうか,と思うかもしれません.

確かに現代のパソコン用 OS の規模はとても大きくなっていて,その規模のものを個人で作るのは無理です1. しかし「OS の骨格部分を作る」に限定すれば,そんなに無理な話ではありません. 13 年前に出版された「30 日でできる!OS 自作入門」では 30 章に分けて OS を 1 から作っています. ここで作る OS は規模は小さい2ですが,プロセス管理,メモリ管理,デバイスドライバなど,OS の基礎を学べます.

こんなにちゃんとしたパソコン用 OS が存在する現代において,「OS 自作」は何の役に立つのでしょうか. 筆者(内田)が考える OS 自作の良いところは次の 3 点です.

  1. 低レイヤプログラミングは楽しい
  2. 現代の OS がどうしてそういう実装になっているのか,経験的に学べる
  3. 低レイヤに詳しくなれる

1 は人によりますが,筆者は低レイヤプログラミングがとても好きです. 普通のアプリケーションを書いているだけではパソコンの中身を触ることはできませんが,OS を自作することでハードウェアを生で触ることができます. 筆者は,この「ハードウェアを自分の力で操ってる感」が楽しみで OS 自作をしています. ハードウェアを制御するドライバプログラムを書いているときが一番幸せです.

パソコンの中身を見てみると実にいろいろなハードウェアが搭載されています. グラフィックボード,PCI バス,USB コントローラ,タイマ,ストレージ,メモリ,などなど. 挙げたらキリがありません. 既存の OS を使うだけだとこの辺りのハードウェアを直接制御する機会はありませんが, OS 自作を通して自由自在にハードウェアを触る経験をしてみるのもいいんじゃないでしょうか.

また,OS は IT システムを構成する重要な要素です.しかし OS の中身を知らなくてもアプリケーションを開発できるため,多くの人にとっては OS が具体的に何をするかは謎ですし,謎のままでそんなに困っていないかもしれません.

しかし,性能を求めるソフトウェアシステムを構成したり,低レイヤ部分に原因がある問題を解析したりするためには OS についての深い知識が欠かせません.特にこのレイヤにセキュリティ脆弱性があると,単一のアプリーションにとどまらずシステム全体の安全を脅かします。2018 年頭から世間を賑わせた Spectre & Meltdown はその代表例でしょう.多数の顧客が同一システムに載るクラウドサービスが全盛の現代では,低レイヤを深く知る重要性がより高まっていると言えます.

さて,一言で「OS 自作」と言っても方向性は多岐に渡ります. このゼミでは, 4 つのテーマ「最先端 OS 談義」「Linux 開発者を目指そう!」「Raspberry Pi向け組み込みOSを作ろう!」「フルスクラッチ OS を書こう!」をテーマに,それぞれ得意分野とする講師が担当します. 皆さんの熱意を,講師がバックアップします.

最先端 OS 談義

粟本が担当する「最先端 OS 談義」のテーマでは、OS に興味がある人向けに、「独創的な OS を自力で作れるだけの実力や思考回路をゼロから身につける」事を目的としています。

詳しくはこちらのブログ記事をお読みください。 http://raphine.hatenablog.com/entry/seccamp2019_exercise

Linux 開発者を目指そう!

このテーマは武内が担当いたします。

このテーマでは既存、かつ世界で最も広く使われているOSカーネルであるLinuxカーネルの開発をします。本講義では既存のLinuxカーネルを改造してみなさんに独自の機能を追加していただきます。これによってカーネルとは何なのか、Linuxカーネル開発がどのようなものであるかを体感できて、世界が広がることでしょう。

Linuxカーネルの開発をするにあたっては大きな障壁がいくつもあります。以下はその例です。

  1. ソースコードが巨大
  2. カーネル開発独自のルールを知る必要がある
  3. 開発言語がいまどきほとんど使わないC言語アセンブリ言語

本コースではキャンプ当日までの事前学習によってこの障壁を突破した上で本番の3日間で独自機能追加をしていただきます。

事前学習では次のようなことを学びます。

事前学習においては本番に必要な最小限の知識のみを段階的に覚えられるように工夫しているため、全く知識がないかたも安心してください。これに加えて受講者のみなさまの前提知識を事前にヒアリングして、それをもとにさらに追加の学習項目を追加する予定です。

キャンプ本番では次のようなものを開発することを予定していますが、何かお好みのものがあれば変更もできます。

もし学業が忙しいなどの理由で事前学習が最後までたどり着かなかった場合も、本番で事前学習の続きに取り組むこともできます。自分のできるペースで、できるところまでやりましょう。

Raspberry Pi向け組み込みOSを作ろう!

Raspberry Pi向け組み込みOSを作ろう」担当の西永です。 私のテーマではRaspberry Piで動作する組み込みOSを、私と一緒にフルスクラッチで、つまりアセンブリ言語のレベルから全て自分で手を動かしながら作り上げていきます。

今年はセキュリティキャンプ講師主査の坂井さんの書かれた書籍「12ステップで作る組み込みOS自作入門(カットシステム社)」をベースに組み込み自作OSを開発していきます。こちらの書籍ではH8マイコンを対象に開発を行いますが、私の講義では対象をRaspberry Piに変えて行なっていきます。難しそうに思われるかもしれませんが、読み替えが必要な部分や、開発に必要な知識は全て講師の西永が提供してサポートしますので、ご安心ください。

私はこのゼミを通して参加者の方々には以下の知識・経験をプレゼントできればと考えています。

  • OSの無い組み込みハードウェアを1から開発するための知識と経験
  • 開発に必要な資料の探し方、読み方
  • 組み込み開発の難しさと、それを遥かに上回る楽しさ

また、実際に私のゼミに参加することになった方々には以下の事前課題の実施をお願いする予定です。もちろん、学習のために必要な資料は全てお渡ししますし、わからないところは講師がサポートしますのでご安心ください。

最後に、雰囲気が知りたい方のために昨年の資料の公開場所をお伝えします。

https://speakerdeck.com/tnishinaga/security-camp-2018-baremetal-seminar-material

以上で紹介を終わります。 講義内容にご興味を持たれた方は、ぜひ私と一緒に組み込み開発を楽しみましょう! ご応募お待ちしております!!

フルスクラッチ OS を書こう!

筆者(内田)が担当します.

このテーマでは OS をフルスクラッチで開発します.フルスクラッチとは,既存のものを改造するのではなく新規に作るという意味です.フルスクラッチですから,OS の起動部分から始まり,メモリ管理,プロセス管理,画面出力,キーボード・マウス入力などを一通り実装することになります.個人でもこれくらいは作れるという例を示します.

こんな OS を作ります,という例.「はりぼてOS」動作画面写真集より.

このスクリーンショットは「30 日でできる!OS 自作入門」という本で作る「はりぼて OS」の最終的な画面です.ウィンドウがぽこぽこ表示され,インベーダーゲームが動き,JPEG 写真が表示されています.日本語のテキストファイルも表示できますし,音楽だって鳴らせます.ただの見せかけで OS の機能がしょぼいかというとそうではなく,カーネルとアプリはちゃんと分離されていて,アプリからはシステムコールを叩いてカーネルの機能を呼び出す,というように割と本格的な仕組みになっています.これが出来合いの OS を改造しているわけではなく,すべて自分で実装しているのです.なんだか,自分でもできそうな気になってきませんか.

このテーマに興味がある方は「30 日でできる!OS 自作入門」とか「はじめての OS コードリーディング」などの OS 系の本を読んで実際に実装してみたいなと思っているかもしれませんし,もしかするとこのブログを読むまでは興味が無かったかもしれません(そういう方は是非,別記事も合わせて読んでください).もしかすると,OS は一通り実装したことがあって,発展的な改造をしたいなと思っている方もいるかもしれません.このテーマは,そのような思いを持つ方(初心者から上級者まで)が,実際に手を動かして実装を進めていく場を提供します.ずっと自作 OS の分野で活動してきた講師(筆者のことです)が隣にいますので,アイデアを議論したり,実装に詰まったときのお手伝いが可能です.

今まで OS を自作したことが無いけど,興味がある!という方は,別記事でちょっとした入門の話を書こうと思いますので,是非読んでみてください.

このテーマではキャンプ当日までの事前学習があります.事前学習ではキャンプでどんな OS を作るかを考えたり,それを実装するのに必要な資料を集めたり,実際に少しずつ開発を始めたりします.キャンプの 3 日間で最高の成果を出せるように事前準備がとても大事なのです.キャンプ当日の 3 日間よりも事前学習が本番だと言っても過言ではありません.

皆さんと OS の開発ができることを楽しみにしています.是非「OS 開発ゼミ」に応募してください!そして,テーマに応募していただける場合は,選択問題 S1 に必ず回答してくださいね.


  1. 講師の粟本さんが教育用に作った minimal linux は,最低限の動作だけするように Linux からコードをそぎ落としたものですが,それでも圧縮した状態で 15MB 程度のコード量です.ソースファイルは約 900 個あり,4 コア 8 スレッドのサーバー向け CPU を積んだマシンでビルドに 20 秒かかるようです.個人で書くのはとても難しい量です.

  2. はりぼて OS の最終版 harib27f は,ドライバを含めたカーネル部分のソースコード行数は 4456 行,約 114KiB です.https://www.youtube.com/watch?v=DHRIY2LMcTM