なかなかハードルが高く,多くの人が踏み出せないでいるカーネルのソース・コードの読解。本連載では,今までカーネル・ソースなんて見たことがないという人に,読みこなすコツをお教えします。今回は,ソースを読むための大前提となるC言語の基本知識について学びます。

 カーネルのソース・コードは,基本的にC言語で書かれています。そのため,C言語をある程度読めなければ話になりません。といっても,カーネル・ソースを読むのが目的ですから,C言語のプログラムを書く必要はありません。コツさえ分かれば,読みこなすのはびっくりするほど簡単です。そこで,今回は,カーネルを読みこなすために最低限知っておくべき,C言語の知識をお教えします。

 まず,図1を見てください。C言語をほとんど見たことがない読者の方は,何が何やらさっぱり分からないのではないでしょうか。でも大丈夫です。意外に難しくありません。


1 #include <stdio.h>
2
3 string()
4 {
5  char msg[]="Linux";
6  fprintf(stdout, "msg[1]=%c\n", msg[1]);
7 }
8
9 main()
10 {
11  int abc=123;
12  fprintf(stdout, "abc=%d\n", abc);
13  string();
14 }
図1●C言語のプログラム

 図を見ると分かるように,いろいろな単語が見えます。

 例えば,「include」や「string」,「char」や「main」などがあります。これらの名前は,C言語の文法として最初から意味が決まっている「予約語」と,プログラマが自由に名前を付けられるものとに分けられます。

 予約語は,例えば「if」や「else」,「while」など,たくさんあります。これらはC言語の入門書を読めば詳しく説明されています。

 図1で言うと,1行目の「include」,5行目の「char」,11行目の「int」,12行目の「stdout」などが予約語で,「string」や「msg」,「abc」などがプログラマが勝手に作った名前です。どれが予約語でどれがプログラマが作成したものかは,慣れればすぐに分かるようになります。予約語はあまり多くありませんので,すぐに覚えられます。逆に言えば,ソースに出てくるほとんどの単語は,プログラマがどこかで定義したものだということです。つまり,ある単語が出てきたときに,それがどこで定義されているものなのかを,膨大なソースの中から,探さなければいけません。

 予約語のうち,intというのは変数の型(種類)を宣言するもので,「この次に書く変数は,整数です」という意味です。「int abc=123;」と書くと「abcという名前の整数型変数が作られ,初期値は123です」という意味です。また「char」は,文字(キャラクタ)型変数を宣言します。

データ宣言後が処理手順

 予約語ではなく,プログラマが作成した単語は,3つの種類があります。(1)関数,(2)変数,(3)配列,です。

 これらを見分ける方法は簡単です。その単語の後ろに「(」(カッコ)が付いているものが関数で,かぎカッコ「[」が付いていたら配列です。これら以外は変数名です。関数とは,引き受けた値を処理して結果を返答するものです。関数に与える値を「引数」と呼び,カッコの中に記入します。複数ある場合にはコンマで区切って記入します。処理結果は,関数名そのもので表します。例えば,add(x,y)が,xとyを加算する関数だった場合,add(1,2)は3になります。

 図1では,stringが関数です。この関数の処理内容を記述しているのが,「{」と「}」で囲まれた,5行目と6行目の部分です。そして,この関数を使っている(呼び出している)のが,13行目です。この例ではstringの引数に何も入っていません。このように引数が何もないときもあります。

 9行目のmain()も関数です。この関数は特別な意味があり,このプログラム・ソースの開始ポイントを示します。プログラムの中で一番最初に実行される関数です。図1では,string関数の方がmain関数より上に記述されていますが,最初に実行されるのはmainです。string関数はmain 関数から呼び出される格好です。

 なお,Linux上で動くアプリケーション・プログラムにはmain関数が必ずありますが,カーネルのソースにはmainがありません。なぜならば,後述するようにカーネルは,割り込みなどのイベント発生時に実行されるので,開始場所を指定する必要がないからです。