Instantly share code, notes, and snippets.

Embed
What would you like to do?

OS と kernel と私 #vgadvent2013

VOYAGE GROUP エンジニアブログ Advent Calendar 2013 21日目の記事として書かれています。

今年もあと10日となりました、皆様、如何がお過ごしでしょうか。

VOYAGE GROUP へ参加してまだ4ヶ月の @awa-vg です、おっさんです。 主に fluct のインフラを担当しています。 Advent Calendar を見ても分かる様に、VOYAGE GROUP は開発系エンジニアが多いですね。 「さすがたじーさん」のように AWS ネタでかっこ良くとかも憧れつつマイノリティであるインフラエンジニアらしく地味に行きましょう。

前置き

タイトルにある「OS と kernel と私」は懐かしいアレのパクリで、ネタを探していた当初は、

「Linux の特定ディストリビューションをディスって炎上っぽく PV 稼ぐか」

とか考えていたところ、うちの CTO (@makoga) さんから

「今どきの若い子って kernel の事とか理解ってるのかな?」

という質問を貰い、(それはそれでネタにできるか…) と路線を切り替える事となりました。 若くない人でも kernel の事を知らない人はたくさん居ますし、若い子でも凄く詳しい人はもちろん居ます。 ただ、Linux が一般化し、デスクトップにも普通に使われる現在、昔と比べると、

「kernel (もしくは OS の細かい部分) を知らなくても困らない」

の度合いが高くなったのは事実でしょう。これ以上昔話に広げると老害になるので前置き終了。

本題

ここからは一般的な PC サーバを前提に話が進みます、さらに勢いに任せ OS や kernel の話ですらなくなっていきます。

OS と kernel

さて、これを読んでくれている皆様は、「OS と kernel の違いを3行で説明せよ」となったらどうします?

いろいろ表現の仕方はあります。私の場合、

  • kernel とはハードウェア (CPU、メモリなど) とアプリケーションのやりとりを直接管理する
  • OS とは kernel を内包し、kernel の持つ管理機能を抽象化してアプリケーションに提供する
  • kernel の違いは、UI を通して操作するユーザにとって OS の違い程の差は無い

タスク管理、プロセス間通信やシステムコールなどかなり端折ったものの、こんな感じになります。 つまり OS やアプリケーションは kernel という存在があって初めて、自分の役割を果たせる事になります。

kernel と OS の基本部分はサーバ系のインフラエンジニアにとっては日常的に触れるものです(よね?) 目的を果たすために config を変更して build したり、sysctl を利用して挙動をコントロールします。

それでは次に、「kernel はどうやってコンピュータの中で動く事ができるのかを説明せよ」と言われたらどうでしょう。 一般的な OS は ROM に格納されているわけでもなく、そもそも自分自身が kernel なわけですから、通常のソフトウェアの様に kernel や OS の助けを借りる事もできません。

「コンピュータはソフトウェアをロードしないと動作できないが、ソフトウェアをロードするにもソフトウェアが必要」

有名なパラドックスです。ついに話が bootstrap までたどり着きました。

bootstrap

では bootstrap とは何でしょう。このあたりは言葉の持つ完全性より伝わりやすさ重視で行きます。

「自分自身で自分自身が動ける状態まで持っていく手順」

だと考えるようにしています。 これは

  1. 電源投入時に BIOS の決められたメモリ番地にある命令を実行する(これは決め打ちなため可能)
  2. BIOS の初期プログラムが格納されているところへジャンプさせられ、制御が BIOS へと移る
  3. BIOS はハードウェアのチェックや初期化を行い、boot 可能なデバイスを探す
  4. デバイスが見つかればそのブートセクタ (MBRなど) を決められたアドレスにロードして実行する
  5. ブートセクタは boot 可能なパーティションを探しそこにあるブートセクタをさらにロード
  6. 最後に kernel をロードして OS の起動が始まる

といった面倒な手順を踏むことで実現しています。(BIOS や MBR の話まで行くと終わらなくなるので勘弁) ※ 実はこの説明は少し古いものです。 (Intel の EFI などの登場により実は BIOS 無しでいきなり MBR もしくは GPT のあるパーティションからでも boot 可能です)

ただ、この流れを知った上でパソコンの電源を入れると、OS が起動するまでのメッセージがそれぞれ何を目的としてどこで実行されているのかわかりますね。

ちなみにコンパイラの bootstrap もコンパイラをコンパイルするコンパイラをどうするかという命題を解決しています。

まとめ

そんなわけでいろいろ省略しつつ OS と kernel の話から bootstrap まで辿りつけたので私の目的は果たせました このネタがほんの僅かでも誰かの参考になったのであれば幸いです。

最後に、

  • たまには OS の根っこで頑張っている kernel の事も思い出してください
  • kernel compile は一度はやってみてください OS は問いません、FreeBSD とか楽しいですよ?
  • OS compile も一度はやってみてください OS は (ry

以上、季節感も何もない隠れデーモン信者の @awa-vg でした、バイバイ


明日はちょくちょく新しいネタを提供してくれて勉強させてくれる @katzchang さんです。お楽しみにー

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment