なかなかハードルが高く,多くの人が踏み出せないでいるカーネルのソース・コードの読解。本連載では,今までカーネル・ソースなんて見たことがないという人に,読みこなすコツをお教えします。今回は,どうしたらカーネル・ソースを読みこなせるようになるのか,筆者の経験をお話します。

 Linuxユーザーなら誰しもカーネルのソース・コード(カーネル・ソース)を読んで,どのような処理を行っているのかを確認したり,自分なりの変更を加えたりしたくなるのではないでしょうか。しかし,カーネル・ソースの量は膨大な上,C言語で書かれているので,コンピュータ内部やOS(オペレーティング・システム)の仕組みを理解したプログラマでないとなかなか読みこなせません。そのため,カーネルを読むための第一歩を踏み出せない人が数多くいることは事実です。

 本講座では,プログラマではないごく普通のLinuxユーザーが,カーネルをある程度自力で読めるようになるまでの橋渡しをします。カーネルを読むことは結構,ハードルが高いのですが,ひとたび読む手法が分かれば,後は容易に道が開けます。

 読者の皆さんがLinuxマシン上にインストールしているディストリビューションは何でも構いません。カーネル部分は(ほとんど)同じだからです。

 今回は,最新のカーネル・ソースを入手して展開します。ソース内にどのようなディレクトリがあって,それぞれどのような役割があるのかを見ていきます。また,カーネル内部で,目的のプログラムやファイルを探し出すコツもお教えします。

 なお,カーネルのコンパイル方法については,関連記事「やってみると意外に簡単!? Linuxカーネル・コンパイル入門」をお読みください。

カーネルの役割

 最初に,そもそもカーネルは何をしているのかを知っておきましょう。

 カーネルがなくても,パソコンで動くプログラムは作れます。ただし,大変な作業が必要になってしまいます。カーネルがあるからこそ,簡単にプログラムを作成できます。

 例えば,キーボードから入力した文字をディスプレイに表示するだけのごく簡単なプログラムを考えてみましょう。このプログラムを作成するには,「read」や「write」といった命令を書くだけです。プログラマは,キーボードやディスプレイのハードウエアの仕組みを全く意識しなくて済みます。ディスプレイ装置に表示するときも,磁気ディスクに保存するときも,そしてインターネット接続している相手の画面に表示するときも,すべて同じwrite というプログラムの命令を書くだけでよいのです。これは,カーネルがハードウエアとやり取りする処理を代行してくれているからです。

 また,一台のLinuxパソコンには複数人のユーザーが同時にログインできますが,それぞれのユーザーは独立してパソコンを使えます。これは,たとえ同じパソコンを同時に使用していても,カーネルがどのユーザーから依頼された処理かをきちんと識別しているからです。

 このように,ハードウエアの細かな仕組みをいちいち理解しなくても,さまざまな処理プログラムを作成できるのは,すべてカーネルのおかげです。

 とはいえ,コンピュータを利用するだけで,「カーネル内部を知る必要はない」と考えるユーザーも多いと思います。確かに車を利用するだけなら,エンジンやブレーキの働きを知らなくてもアクセル・ペダルを踏んだり,ブレーキ・ペダルを踏んだりして操作できます。オートマチック車なら,面倒なクラッチ操作も不要です。

 しかし,車の調子が悪くなったり,故障したりしたらどうでしょう。ディーラで説明を受けて,修理に必要なパーツや工程を教えてもらっても,理解ができなければ,ディーラの言うなりになるしかありません。そのため,車を賢く使うためには,ある程度は車の仕組みを知っている必要があるのです。

 コンピュータの世界では,カーネル(OS)は昔からありました。コンピュータ・メーカーが自社のコンピュータに付けていたのです。でも,ソースが公開されていない場合が多かったので,利用者はカーネルを読みたくても読めませんでした。今でも,メーカーと契約を交わさないとソースを見られないOSがあります。

 Linuxはカーネル内部をすべて公開しています。実際に動作して,世界中で利用されているカーネルを読むことができるのです。すばらしいことではありませんか!

 筆者は,Linux-1.2.13のときに初めてカーネル内部を読みました。最初はネットワーク部分に特化して読みました。理由は「世界標準の TCP/IP技術」を学生に教えるためだったからです。カーネル内部のネットワーク技術を読むことで,処理手順を詳細に理解でき,トラブルが発生しても,すぐに原因究明や再発防止ができるようになります。もしカーネル内部を読むことができなければ,リブートするしか方法がありません。

どれくらいの時間と技術が必要か

 「カーネルがせっかく公開されているのだから,読まないよりも読んだ方が良いことは分かったけど,どれほどの時間や技術が必要なの?」と思うかもしれません。企業が開発した独自OSならば,その企業の教育担当者のセミナーを受講することで技術を習得できます。しかし,オープンソースのLinuxは,残念ですが誰も教えてくれません(読書会などは開催されていますが,いきなり参加するのはなかなかハードルが高いものです)。ですから,私は約5年もかかりました。しかし,その5年のうち最初の4年は,どのようにすればカーネル内部を読めるのかを知るためだけに費やしました。つまり,最初の1歩に時間がかかるのです。

 4年もかかって悟ったのは,「カーネルを読むための基礎知識は意外に少ない」ということでした。その第一歩を本連載の読者の皆さんにお教えしようと思っています。いったん読み方が分かれば,早いものです。

 具体的には,知っていなければならない技術は,“たったの5項目”程度です(図1)。


・データ構造の表現方法
・プログラム構造の知識
・カーネルをコンパイルする技術
・ライブラリの利用・指定方法
・エラー表示の確認方法
図1●これだけ身に付ければカーネルは読めるようになる

 これら一つひとつは順次,解説していきますので今の段階では分からなくて結構です。筆者は,Linux用に公開された米Intel社の無線LAN機器のデバイス・ドライバを読みました。読んで理解すると同時に,バグ(不具合)まで発見しました。Webページにも詳細な解説は公開されていなかったのですが,ソースを読むことができたので,初めての無線LAN接続も難なく設定できました。ソースを読み始めるまでに長い時間を必要としましたが,一度読む技術を身に付けると,初めて公開されるソースも容易に短期間で読むことができます。

 「オープンソース技術者が足りない」といわれていますが,どのようにすれば読めるようになり,開発できるようになるのかを道筋を立てて解説する場が無いだけなのです。第1歩を踏み出すのに,勇気と時間がかかり,教えてくれる人が身の回りに少ないという,意外とハードルの高いのもオープンソースの特徴です。