5. カーネルを書く際の注意点

(OHP 9)
-----------------------------------------------------
Kernel vs User Level
- Inherently multi-threaded
- Security
- Stack and Memory allocation
----------------------------------------------------

このスライドは Linux kernel を改造しようとしている人向けに基本的なとこ ろを説明するためのものだ。この中で Kernel のソースコードを見たことのあ る人は?(あまり手はあがらない)

あー、ずいぶん少ないね。他のところだともっと手があがるのにね。カーネル のソースコードは読むとずいぶん面白いものだよ。僕がそう感じているんだか ら。(会場 笑)

カーネルを書く際に特に注意しなければいけないことが 3 点ほどある。

一つは「カーネルのマルチスレッド性」という点。カーネルは何百ものプロセ スが動いているマシンを管理しているプログラムで、もし 2 つのプロセスが 同じことをしようとすると、どちらを先に処理させるかという判断をするのも カーネルの仕事になる。カーネルを書く場合、競合状態やデッドロック状態に 特に注意を払う必要がある。普通のプログラムではこのような状態が起きるこ とは滅多にないし、これらにはなかなか気づかないんだけど。

カーネルのソースを初めて見た人は、「馬鹿みたい、なんで同じチェックを 2 回もするの」とか言いたくなるかも知れない。でも、それはカーネルにのみ起 りうることをチェックしてるんだ。

すなわち、それが「セキュリティ」ということで、我々が扱っているのはマル チタスクシステムであり、普通のユーザーが書いたプログラムが少々問題とな る振る舞いをしても、それがシステムダウンを引き起してはならない。すなわ ち、一つのプロセスがシステムをクラッシュさせないように、カーネルの中で は「セキュリティ」について十二分に配慮する必要がある。百人もの人が同時 に使っているマシンを何かのプログラムがダウンさせれば、他の人にずいぶん 迷惑をかけることになってしまうからね。

もう一つ、カーネルはシステム全体のメモリやプロセスを管理しているプログ ラムだから、カーネル自身のメモリ管理は自分でやらなければならない。カー ネルプログラムがもっとメモリが必要だと思っても、カーネルにメモリを要求 することはできない、だって自分自身がカーネルなんだから。だから、カーネ ルのメモリアロケーションは自らの手でやらねばならない。

フロアからの質問

Q: カーネルはずいぶん巨大なプログラムになっているが、カーネルについて勉 強するとすれば、どこから手をつければいいのか?

A: カーネルについて勉強したいなら、まずカーネルについて説明した良い教 科書を読むことだろう。僕が推薦するのは A.Tannenbaum の "Operating System : Design and Implementation" だ。この本は専門書として抜群のもの だとは言いにくいけど、読みやすいし、理解しやすい本だ。この本で基礎的な 知識を得たら、Linux のスケジューラのあたりを読んでみてほしい。Linux の スケジューラは、どのプロセスを走らせるかを一つのファイルの中で処理して いるおもしろいプログラムだから。

次に僕が現在取りくんでいる問題を話しておこう。僕が今取りくんでいるのは、 「移植性」に関する問題だ。Linux は御存知のように Intel 80x86 プロセッ サから始まった。現在では多くの機種に移植が進み、先にも述べたように DEC Alpha では既に安定に動いているし、MIPS への移植はドイツで進められてお り、shell が動いたと聞いている。最近のカーネルではいくつか PowerPC 用 のコードが入っていることに気づいている人もいると思うけど、PowerPC では まだ動いていない。動くようになるにはもう半年くらいはかかるんじゃないか な? SUN-4 といった Sparc への移植も進められているがまだまだ不安定な状 態だ。

少し Alpha を例に「移植性」の話を詳しくしておこう。