マナティ

なぜOSを作るのか? ただ面白いからだけじゃない!  新刊『ゼロからのOS自作入門』が大ヒット中!

3/22に発売になった新刊『ゼロからのOS自作入門』がすでに各書店で注文が殺到!異例の大ヒットとなっています。ガイドに沿って進んでいけば、誰でも「自作OS」という頂にたどり着くことができるという本書の内容に迫ります。

エンジニアなら誰もが夢見る!?OS自作

みなさんはこの記事を読むのにどのようなOSを使っていますか?

PCならMac OSかWindows OS、もしかしたらLinuxという方もいるかもしれません。スマホならAndroid OSかiOSがほとんどでしょうか。

では、自作のオリジナルOSを使っている方は? …おそらく、一人もいないのではないでしょうか(もし使っている人がいたらごめんなさい)。

そんな、おそらく誰もいないであろう「自作OS」にチャレンジするための本が『ゼロからのOS自作入門』です。

この本は OS を手作りする本です。OS 作りに関する知識が無いところから始めて、30 章で簡単な機能を持つ OS、名付けて「MikanOS」を作ります。30 章が終わった後には画面のようになります。この画面にあるものすべて、この本に書かれている内容を元に手作りしてるんですよ。もちろん、これらの機能は、他の OS の力を一切借りずに自力で動いています。


210322_2.1.png
見てください、しっかりGUIでマルチタスクで、ポインタやテキストエディタもしっかり機能しています。こんな本格的なOSが、イチから自分で作れるなんて、ワクワクしてきませんか?しますよね?しませんか?

で、
なんの役に立つの?

と聞きたくなる方もいらっしゃると思います。
もちろん、高性能なOSが世に広まっているこの時代に性能的な意味では自作するメリットはないでしょう。しかし、著者はこう言います。

OS自作というのは一見するととっても無駄なことです。すでに高機能な OS がいくつも存在するのに、それを後追いで作ろうというわけですからね。しかし、OS 自作は私たちに貴重な経験を与えてくれます。コンピュータシステムがどう動くのかを探求することは知的好奇心を大いに刺激します。実用面でも、パソコンのハードウェアや OS の処理内容に関する知識はソフトウェアエンジニアの仕事の幅を広げてくれます。OS の動作に目が向くようになり、効率的に動作するアプリの作り方を探求できるようになるでしょう。あるいはシステムの障害原因調査において、OS をデバッグした経験をもとに深いところまで原因追求ができるでしょう。いざ Linux カーネルのコードを読む必要に迫られても、OS を作った経験が有ると無いとでは読みやすさが格段に違います。

なるほど、コンピュータシステムの根っこの部分を学ぶことによって、
  • OSを自分で作っていく過程で自分が普段何気なく触っているPCやスマホが動く仕組みを理解することができる
  • OSや時代が変わっても共通する普遍的な知識が身につく
  • Linuxなどの既製品のOSを自分でカスタマイズしたいときにも役立つ
というわけです。
ただの道楽ではなく、普遍的な骨太の知恵を身につけるための本なんですね。

実例 ポインタの基本

それではさっそく本書ではどのように実際にOSを作っていくのかを覗いてみましょう。
たとえば、毎日なにげなくやっている「マウスを動かす」という操作をひとつとっても、ポインタの動きをどのように表すのかを定義しなければなりません。以下は本文の引用です。

ポインタ(Pointer)は、指す人とか指し棒とかの意味を持つ英単語です。獲物の位置を人間に知らせる犬種の名前でもあります。「マウスポインタ」は画面上の1点を指す矢印ですよね。これがC++の文脈になると「変数を指す物」という意味になります。
以下は、ポインタの基本となる例です。

int i = 42;
int* p = &i;
1行目でint 型変数を定義し、初期値を42 とします。2行目でポインタ変数pを定義し、初期値をiへのポインタとします。これでpはiを指すポインタ変数となります。
210322_1.png
これ以降、pを用いてiの値を読んだり、変更したりできます。上記の2行に続けて下記のコードを実行すると、r1の値は42、r2の値は1となります。
int r1 = *p;
*p = 1;
int r2 = i;

「*p=1;」の*は、ポインタの指す先を取ってくる(参照する)ための演算子です。これを間接演算子と呼ぶのでした。この行の時点ではpはiを指していますから、*pはiと等しくなります。
C++の規格では、ポインタをどのように実現するかをほとんど規定していません。ただ、ポインタと整数は相互に変換可能である、ということは決まっています。そして、異なる変数へのポインタを整数に変換したものは、互いに異なる整数になる必要があります。言い換えると、ポインタはそれぞれの変数に割り振られた固有の番号を内包します。ポインタとは、変数固有の番号と型情報を組み合わせたものだと言えます。
 
uintptr_t addr = reinterpret_cast<uintptr_t>(p);
int* q = reinterpret_cast<int*>(addr);

この1行目は、ポインタから整数への変換です。あらゆるポインタの精度を失わずに変換が可能な整数型としてuintptr_t(あるいはintptr_t)が標準で用意されていますので、それを使います。ポインタから整数への変換は、ポインタから型情報を削除することに対応します。変換して得られた値addrは、変数iに割り振られた固有の番号となります。
2行目は整数からポインタへの変換です。この変換は変数の番号に変数の型情報を加えることに対応します。結果として得られるqは、変数iを指すポインタとなります。
変数に割り振る固有の番号を具体的にどんな値にするかはC++の規格で規定されておらず、処理系に任されています。本書で使うClangを含む多くのコンパイラは、変数が配置されたメモリアドレスを使います。メモリアドレスはバイト単位の連番になっていますので、変数固有の番号でなければならないという制約を満たします。

いかがでしょうか。どのような方法でポインタの情報を表現していくのか、雰囲気だけでも掴めましたか?

さあ、OS自作の世界へ!

ゼロからのOS自作入門」は全744ページの大ボリュームです。
これをしっかりと理解して少しずつコードを実行していくと、最終的には「UEFI BIOSにより起動してIntel 64モードで動作、ページングを用いてメモリ管理を行い、USB3.0ドライバを搭載。ウィンドウシステム、プリエンプティブマルチタスク、ファイルシステムを持つOS」が完成します(本文1ページより)。
「意外と本格的だな」と驚いたでしょうか、それとも「意味がよくわからないな」と思ったでしょうか?(もちろん、用語の意味は読んでいけばわかりますよ!)

OSを「ゼロから」作っていく過程で、「C++のポインタってメモリの中でこうやって処理されていたのか!」「複数のアプリケーションを同時に実行しているとき、OSではこんな処理を行っていたのか!」といった驚きと発見がいくつもあるでしょう。

本書を読んで身に着けた知識は、たとえばCPU負荷を改善して開発中のアプリを少しでも効率的に動作させたいとき、システム障害が発生して深い原因調査が必要になったとき、あるいはLinuxを改造して大規模なオリジナルのOSを作りたくなったときなど、様々な場面できっと役に立ちます。
組み込み開発やゲーム開発などで低レイヤに関する知識を深く学びたい方、C++を使った開発に興味がある方には特におすすめの一冊です。

商品ページの試し読みでは、本書の冒頭45ページを公開しています。本記事を読んで興味がわいたよ! という方は是非そちらもご確認ください。

<商品ページ>

おわりに

ITの世界では昨日まで流行っていた技術が新技術によってすぐに古くなってしまうことは珍しくありません。
ですが、基本的な仕組みの部分が大きく変わるものではありません。たとえば弊社発行の書籍、「30日でできる! OS自作入門」は、発行から15年たった今でも愛され続けています(現在セール中!)。
実は、「ゼロからのOS自作入門」はこの本の流れをくんで内容を現時点(2021年3月)で一般的に市販されているPCで試せる内容に一新したものになっています。
この分野に深いご興味がおありでしたら、セットで買ってみて読み比べてみるのもおすすめです。

本書で得た知識や技術はOSを自作するときだけではなく、今後なにか新しく学習を始めるときにも必ず役に立つことでしょう。
ぜひ、長く使える一冊としてお手元に置いてくださると幸いです。
 

こんな人におすすめ

  • 情報系学科の学生
  • 組み込み開発やゲーム開発など、低レイヤの知識を必要としている方
  • 純粋に興味としてOSの仕組みを学びたい方
  • 絶対に自分でオリジナルのOSを作ってみたい! という熱い想いを持っている方

こちらもおすすめ

30日でできる! OS自作入門
歴史的名著が現在セール中!

ロベールのC++入門講座
「ゼロからのOS自作入門」でも使っているC++をちゃんと学びたい方にオススメ。現在セール中!

CPUの創り方
「ゼロからのOS自作入門」を読んでもっと色々とゼロから作りたくなってしまった方にオススメ。OSの次はCPUを作ってみよう!現在セール中!

Ubuntuスタートアップバイブル
Linuxのディストリビューションのひとつ、Ubuntuをこれから始めたい方にオススメ。

試して学ぶ Dockerコンテナ開発
高機能なオリジナルOSを作りたい方には仮想環境の学習がオススメ。仮想環境を構築して安全に、そして自由にOSをカスタマイズしよう! 現在セール中!

著者プロフィール