uchan note

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

uchanの自作OS的な自分史

筆者(uchan)は現在,自作OSの分野で精力的に活動しています.そんな筆者も最初から知識が有ったわけではありません.当然ですが最初は初心者でした.このエッセイは,筆者の自作OS人生を振り返り,何のきっかけで自作OSに足を踏み入れ,どうやって成長したかを語るものです.

筆者について

筆者はOS開発関連技術のコミュニティosdev-jpで活動しています.OSや低レイヤ技術が好きな人が集まってもくもくと作業をする「自作OSもくもく会」を2ヶ月に1回くらい開催したり,OSC(オープンソースカンファレンス)に出展したりしています.また,2017年と2018年にはセキュリティキャンプ全国大会でOS開発を主題とするゼミの講師をやりました.

筆者はIntel x86アーキテクチャが好きで,そのためのOSを作るための要素技術を研究しています.OSを作るためにはページングやLocal APICなどのCPUの機能,UEFI,USBなど,ハードウェア的な知識が必要です.またプロセススケジューリングやメモリ管理のアルゴリズムファイルシステムの仕組みなどのソフトウェア的な知識も要求されます.

みなさんは「30日でできる!OS自作入門」という本はご存知でしょうか?2006年発行の古い本ですが,楽しみながらシステムプログラミングを学べる本として未だに人気があります.ただ,流石に内容は古くなってしまい,現代のパソコンでは起動しない機種も多くなっています.例えばこの本はフロッピーディスクで起動することを前提として話が進みますが,今どきフロッピーディスクを読み取れるパソコンなんか持ってる人はほとんど居ないでしょう.筆者はこの状況を打開すべく,現代のパソコンでOSを開発するための要素技術を研究し,同人誌にまとめて出版しています.

「OS」との出会い

筆者がOSというものを認識したのは小学5年生の頃だったと思います.西暦にして2000年頃です.少し前に親に与えてもらったCompaq製のパソコンを使って,おじいちゃんが自治会で配布するための文書を作ったりしていました.親と共にPICマイコンを学び始めたのもその頃です.

あるとき,パソコンの調子がおかしくなり,システムのリカバリーディスクから再インストールをすることになりました.初めてブルースクリーンを見たときは背筋が凍る感覚だったように思います.リカバリーの過程でWindowsというものの存在を認識しました.それまではOSというものは空気のような存在だったのです.それからOSというものに興味が出てきます.

Linuxに出会ったのはそれから少ししたタイミングです.中学1年生くらいのときでしょうか.親が「なんか今Linuxというのが流行っているらしい」と教えてくれて,本屋でRed Hat LinuxのインストールCDが付属した入門書を買ってくれました.Red Hat Linuxのバージョンは7ぐらいだったと思います.早速インストールして起動させると,Windowsとは全く違う見た目になっていて新鮮な感覚でした.マウスカーソルは✕の形ですし,スタートメニューのデザインも異なりました.

この頃はまだ全然Linuxのことを知らず,使いこなすことかできませんでした.すぐにWindowsを入れ直してしまいます.でも,Windowsとは違うOSが世の中にあるんだ,ということを身をもって体験できたことが,筆者のその後の方向性に大きな影響を与えたのは明らかです.

OSASKとの出会い

中学に入った頃からC言語プログラミングを始めました.今は絶版となっている「はじめて学ぶC言語 入門編」1で入門しました.この本はよくある入門書と一味違い,各章で文法説明をしつつ,そこまでに学んだ文法知識を使ってゲームを作る構成になっていました.printfとscanfを学ぶとページ送り方式のノベルゲームのようなもの(条件分岐がないのでゲーム要素は無いですが)を作れるようになり,if文を学ぶと選択肢型のテキストアドベンチャーを作れるわけです.あとから考えると,ここで得た体験(ただ知識を体系的に説明するだけでなく体験できる作りになっている)が,私の「書籍感」に影響を与えています.

そんな感じでC言語を学び終わると,急速にソフトウェアを作ってフリーソフトとして「公開する」ということに興味が出ました.正直なところ,なぜソフトウェアを公開することができる,そういう世界があるということを知ったのかは定かではありませんが,とにかく,この頃はフリーソフトが多数登録されている「ベクター」というサイトを巡るのが日課になっていました.無料のゲームプログラムをダウンロードして遊んだり,C言語開発用のエディタ(お気に入りはCPad for Borland C++ Compiler)を試したりしていました.

ある日ベクターをいつものように探索していたら,とあるカテゴリーに「OSASK」なるソフトウェアを発見しました.説明に「オープンソースで開発中のOSです.コンパクトで起動が速く,マルチタスク,フル32bit,マルチウィンドウです.」とあり,筆者はとても興味を惹かれました.インストールして試してみたいと思いましたが,インストール方法がよく分からないのに加えベクターに登録されているバージョンが少し古かったのもあり,公式サイトに行ってOSASKの作者にメールをしました.これが,筆者のOSASKとその作者,Kたん(川合さん)との初めての出会いです.

「30日でできる!OS自作入門」との出会い

川合さんに連絡をとってからほどなくして,OSASKコミュニティに参加しました.過去の記録を掘り起こしてみると,2003年11月には「OSASK説明書」というタイトルでメーリングリストに投稿するまでになっていたようです.メール文面には「OSASKの使い方についての説明書をhtmlで作ってみたのですが,これをホームページか何かで紹介してくれる人,もしくは内容をみてくれるという方はいらっしゃいませんか.」とあり中学2年生にしては丁寧なメールを書いていたのではないでしょうか(笑).川合さん曰く「行動力がある素敵な学生」だったそうです.

OSASKコミュニティには活動的な人が何人かいて,筆者は彼らを見て育ちました.初めは彼らに習いOSASKアプリの開発を始めました.OSASKには「introシリーズ」という,OSASKアプリ開発に入門するチュートリアルが準備されていて,それをこなしました.その中で特に記憶にあるのが「シグナルボックス」によるGUIイベントの処理です.シグナルボックスという概念は,筆者は当時初めて知って使いこなすのに苦労した覚えがあります.今となってみれば,要はGUIイベントメッセージが入るキューのことなので全然難しい概念ではないのですけどね.当時はC言語プログラミング力もさほど高くありませんでしたし,なんせ初めて触るOSのアプリですから,色々大変でした.

そんな私より少し後にOSASKコミュニティに入ったDAsoranさんという人とIRC(当時使われていたチャットアプリ)でよくお話するようになりました.そのうち意気投合して「僕らもOSを作りたいね」っていう話になりました.しかし筆者はもちろんDAsoranさんにとっても「OSASKアプリ」は作れるものの「OSそのもの」は全くの未知でした.そこで,2人でIRC上で川合さんに質問したのです.「OSの作り方を教えてください」と.この質問は,振り返ってみると筆者の歴史を動かしたものとなりました.

さて,そんな中学生2人からの質問に,川合さんは「他の人には内緒だけど,実は2人にぴったりの本を今書いていて…」と言って,かの有名な本「30日でできる!OS自作入門」2の執筆途中の原稿を送ってくれたのです!筆者とDAsoranさんは,この原稿を読んで感想や修正点を指摘するという義務を負う代わりに,出版前に本を読ませてもらうことができました.2人はOSの作り方を学ぶのにこの上ない教材を与えられ,どんどん知識を吸収していきます.当時,私は高校1年になっていました.

はりぼて友の会とC++

「30日でできる!OS自作入門」が発行されてからしばらくして,読者コミュニティ「はりぼて友の会」が結成されました.はりぼて友の会では各会員が「はりぼてOS」を改造したり,OS開発に関する情報を集めてWikiにまとめたりしました.筆者は,書籍の中では触れられていないホイール付きマウスの使い方を調べてまとめた記憶があります.インターネット上の活動だけでなく,はりぼて友の会は精力的にイベントに出展しました.主にOSCが多かったですが,そこで各会員のオリジナルOSをまとめた「お試しCD」を作って配布するなどしました.筆者は,このような経験を通して開発したりアプトプットしたりする習慣を身につけました.

書籍が出版されたころ,私はC++に興味がありました.ですから,書籍を一通り読んだ後,2週目では「C++への移植」にチャレンジしました.そのためには書籍に付属する開発環境(tolset_h)にどうにかしてC++コンパイラを組み込む必要があります.当時,開発ツールにそんなに詳しくなかった筆者は苦労しつつMinGWからコンパイラを持ってきました.自分の好きな言語で開発ができるようになるとモチベーションが上がり,「はりぼてOS」の改造版ではない,完全オリジナル(と言っても設計思想は非常に似ている)なOSを作り始めます.

さらに奥地へ

はりぼて友の会として活動するのと並行して,書籍では説明が省略されている部分について補完するためにいくつか他の書籍を参考にし始めました.「はじめて読む486」3はこの頃に買ったと思います.Intel x86アーキテクチャが図入りで詳しく説明してあるため,例えばセグメントディスクリプタの属性の設定値の意味がちゃんと理解できました.また,x86アーキテクチャには「ページング」という機能があることを知ったのもこの本のおかげです.「はりぼてOS」では登場しない技術だったので,いつかページングをやってみたいと思ったりしました.

はりぼて友の会で作ったオリジナルOSは「seriboteOS」というもので,RS-232を使ってシリアル通信を行い,電子掲示板に文字列を表示するというOSでした.PICマイコンを自在に扱えた筆者はもちろん電子掲示板も自作したため,自作の電子掲示板を自作のOSから制御する,という非常に興奮する体験をしました.OSCの懇親会でも得意げに人に見せまくったのを覚えています.PICマイコン側の電子掲示板制作には「LCD表示器を操作してみる」4というウェブ記事が非常に参考になりました.今もこの記事が残っているのが感動的です.

この頃から,自作OSで色々なハードウェアを制御したいという気持ちになりました.「ATA(IDE)/ATAPIの徹底研究」5を手に入れたのもこの頃だったような気がします.この本はハードディスクの標準的なインターフェースであるATAの制御法を学べる書籍です.ATAレジスタ構成やサンプルプログラムが載っていました.しかし,当時の自分にはDMAの設定など敷居が高く,結局,ほとんどやらずに本棚にしまってあります.

ブランク

そんなこんなで2008年に大学進学した私は,1年次は授業が忙しく,自作OS関係の活動はあまりしませんでした.ところが2009年に川合さんから,セキュリティ&プログラミングキャンプ2009のOS自作組のチューターとしてお誘いがありました.すでに「自作OS」が少し懐かしい思い出になりかかっていた筆者は,嬉しいお誘いに乗り,チューターをすることになりました.セキュリティ&プログラミングキャンプでは多数の若者が川合さんのクラスを受講しており,3日間集中して各自のOSをがしがし作っていました.筆者は,そんな参加者のデバッグをお手伝いするのが主な役目でした.ここに参加したことで,自作OSに燃える若者がまだたくさんいるんだ,ということに気づきました.

チューターを経験して熱い想いになりはしましたが,やはり大学の授業が忙しく,また,新しい趣味(サークルでのロボット作りやプログラミング,動画漁りなど)ができたため自作OSやセキュリティキャンプからは遠ざかりました.

大学3年生の終わりごろ,いつものようにフェイスブックを開くと,なんと川合さんが友達候補として表示されていることに気づきました.私の知っている川合さんは定職に付かずOSを開発し,資金が足りなくなると本を書いてまたOSを開発する,というようなイメージでした.しかし,フェイスブックには「サイボウズ・ラボで働いている」とあるではないですか!これはなんということでしょう.何年も会ってなかった懐かしさもあり,メッセージで定職に着いているのが本当なのか,それはどんな会社なのか聞いてみよう,と思いました.ちょうど,周りは就活の話が出ていた時期でした.

サイボウズに会社見学に行くことが決まり,人生初めての会社見学というものをやりました.川合さんに社内を案内してもらい,何人か他の社員さんと話した気がします.当時は全然サイボウズという会社を知りませんでしたが,川合さんから「サイボウズ・ラボユース」という慈善活動制度を聞いて,サイボウズはとてもいい会社なのかもしれないと思うようになりました.サイボウズ・ラボユースとは,学生の自由な開発に対してお金を出す制度です.学生はやりたいテーマで応募し,採択されると会社からアルバイト料が支払われます.さらに,作ったものの権利は全部学生に帰属するため,それを修士論文のネタとして使ってもいいという,まさに神の制度でした.大学4年の春からすぐに始めるためにはちょっと時期が悪かったので,1年待って修士1年の春からの開始を目指して応募することに決めました.

翌年,約束通り応募し,採択され,1年かけて「C-Helper」というC言語初学者向けの静的解析ツールを作りました.これは自作OSとは関係がありませんが,その後筆者が自作OSの世界に復活する重要な伏線となります.サイボウズ・ラボユースではサイボウズ・ラボの社員さんたち(特に光成さん)と議論をし,非常に良い経験を積むことができました.

osdev-jpの発足

修士2年になると,徐々に自作OSへの興味が再燃してきます.詳しい歴史は掘り出せなかったのですが,2014年1月には広島のC++勉強会で「C++でできる!OS自作入門」という発表をしていて,それなりにOS開発活動をしていたんだな,という感じです.

サイボウズ・ラボユースを卒業する頃にはすっかりサイボウズのファンになっていた私は,修士卒業後にサイボウズへ入社しました.サイボウズへ入社してからもゆるりと自作OSに携わっていました.2015年6月には(きっかけは忘れましたが)おるみんさんにUEFIを教えてもらい,UEFIの将来性を感じました.2015年8月には筆者の初めての著書「自作エミュレータで学ぶx86アーキテクチャ」が出版されました.ゆるりと個人的にOS自作関連活動をしていた筆者ですが,転機が2016年に訪れます.

サイボウズ・ラボユースでは,毎年春に「サイボウズ・ラボユース成果発表会&卒業式」をやります.その年の採択者が成果発表を行い,最後に卒業証書を授与されるイベントです.筆者は第2期卒業生&社員として毎年のようにこのイベントに参加しています.2016年の3月の「第5期サイボウズ・ラボユース成果報告会」も,例年と同じようなイベントになると思っていました.その時までは.

しかし2016年の成果発表会は違いました.発表のOB枠として,第1期OBの粟本さんによる「OS,FPGAによるネットワークレイテンシの低減(仮)」という発表があり,また,聴講者の1人にかつて「はりぼてWiki」で活躍していたhikaliumさんが参加していたのです.もちろん,サイボウズ・ラボ社員として川合さんも参加していました.全体の参加者20人ほどしかいない空間に,自作OSをやっていた(やっている)人が4人も揃うというのはなかなかの奇跡ではないでしょうか.筆者は運命を感じ,成果発表の懇親会で若者3人で集まって話しました.そして,これから日本の自作OS界を3人で引っ張っていくぞ!ということで意気投合し,osdev-jpが発足しました.

OS技術の探求

筆者はosdev-jp発足後,定期的に「自作OSもくもく会」を開催したり,OS作成に必要となる要素技術を調査したり,技術書典に調査結果をまとめた同人誌を出したりなど,自作OS関連の活動を続けています.この頃には,高校時代には基礎知識や英語力が足りずになかなか調査が進まなかった事柄も調査できるようになっていたため,様々な調査をしました.その中で出会ったおすすめの書籍を紹介します.

オペレーティングシステム 第3版」6は今は絶版になってしまいましたが,オペレーティングシステムの有名な教科書です.理論だけではなくMINIXという実在する教育用OSの実装も紹介されており,リアルなソースコードで学習ができる書籍です.OS理論を体系的に学べるため,見かけたら入手するといいと思います.

Intel 64 and IA-32 Architectures Software Developer Manuals」7Intel x86アーキテクチャ上でシステムプログラミングをするなら必携の書です.Intelが公式に出しているマニュアルで,CPUの機能が網羅的に解説されています.4700ページほどの巨大なマニュアルですが,重要な情報がたくさん書いてありますので手元にダウンロードしておいて損はありません.特にVolume 3 "System Programming Guide"はOSを作成する上で有用な情報がてんこ盛りです.

PCIバス&PCI‐Xバスの徹底研究」8PCIバス規格を説明する書籍です.PCIバスは現代のパソコン(ユニバーサルPC)のアーキテクチャの中枢を担う大切な規格ですので,現代的なOS自作には必須の学習項目です.この本は制御に必要なレジスタを説明し,サンプルプログラムも付属しています.日本語でPCIバスを説明した数少ない書籍の1つです.

FPGAでゼロから作るPCI Express9PCIバスの後継規格であるPCIeの本です.PCIeデバイスを作る方に重きを置いた書籍ですが,ソフトウェア側も多少の扱いがあります.PCIとPCIeはソフトウェア的には互換性がありますので,基本的にはPCI規格だけ知っていればデバイスを扱うことは可能です.PCIeの拡張部分の機能を使うために追加でこの本を持っていると役立つでしょう.

USB3.0ホストドライバ自作入門」10は筆者が書いた同人誌ですが,xHCI向けのドライバを作る際に役立つでしょう.そもそも日本語でUSBホストドライバを作る方法を説明した書籍はとても少ないので貴重な資料となっています.「30日でできる!OS自作入門」ではUSBは扱っておらず,マウスとキーボードはPS/2で接続し,KBCで制御する前提です.現代のパソコン(ユニバーサルPC)にはPS/2KBCは搭載されていないことが多いため,それらの機種向けにOSを作るならUSB対応をしたいところです.

おわりに

ここまでつらつらと筆者が自作OSの世界に飛び込んだ経緯やその後に読んだ書籍などを紹介してきました.どなたかの参考になれば幸いです.このエッセイを読んだことで自作OSを始めてみたくなったり,やる気が上がったりしたら筆者はとても嬉しいです.もし,OS自作を始めてみたいけど周りにサポートしてくれる人(筆者が中学生の頃の川合さんのような人)がいなくて困っているのでしたら,ぜひosdev-jpのSlackに遊びに来てください.筆者やその他のメンバーが質問に答えたりします.Slackは招待制ですから,まずは筆者まで連絡をください(連絡方法は後述).

このエッセイで述べたことはあくまで筆者の経験を説明しただけのことで,正解というものはありません.100人100通りの出会いや勉強方法があることでしょう.大事なのは皆さんが楽しくOSを作ったり,コンピューターに詳しくなれることだと思います.筆者はOSを作ること自体が楽しいと感じますが,OS作成をコンピューターを勉強する手段と位置づけるのも良いと思います.

OS自作を始めるきっかけを作ったり,OS自作の方向性を決めたりする役に立てるために筆者が書いた資料があります.興味のある方はご覧ください.

筆者の連絡先

文献

以下の文献リストは,筆者が実際に学習した順と大体一致するように並べてあります.


  1. 小高知宏 (2002) 「はじめて学ぶC言語 入門編」ナツメ社

  2. 川合秀実 (2006) 「30日でできる!OS自作入門」毎日コミュニケーションズ(現在はマイナビ

  3. 蒲地輝尚 (1994) 「はじめて読む486」アスキー

  4. 山とんぼ (2019) 「LCD表示器を操作してみる」http://www.kimurass.co.jp/pic/0305.htm

  5. インターフェース編集部 (2002) 「ATA(IDE)/ATAPIの徹底研究」CQ出版

  6. Tanenbaum, Andrew S. (2007) 「オペレーティングシステム 第3版」ピアソンエデュケーション

  7. Intel Corporation. (2019) “Intel 64 and IA-32 Architectures Software Developer Manuals”, https://software.intel.com/en-us/articles/intel-sdm

  8. インターフェース編集部 (2004) 「PCIバス&PCI‐Xバスの徹底研究」CQ出版

  9. 内藤竜治 (2013) 「FPGAでゼロから作るPCI ExpressCQ出版

  10. 内田公太 (2018) 「USB3.0ホストドライバ自作入門」http://uchan.hateblo.jp/entry/2018/04/14/182718