|
W/O index |
global による カーネル 2.2.13 の リファレンスページをつくりました。活用してください (Packaged by Masaru. Thanks)。 RAM ディスクのドライバ drivers/block/rd.c です。ブロックデバイスのドライバ の中で、一番つくりが簡単で、それでいてフルスペックの ブロックデバイスですので、参考になるのではないでしょうか。 ただ、ハードウェアを伴わないブロックデバイスですので、 ブロックデバイスドライバの主たる問題の源泉である 割り込みは使われていません。割り込みは、今度(キーボード あたりがいいかな)にしましょう。 では、以下をざっと読んでおいてください。本番のときには コードを全部プリントして行きますから。ところで、 rd.c の半分は initrd の実装についやされていますが、 今回はこれには触れません。 さて RAM ディスクの実装なのですが、まずは この 構造体のインスタンスの 定義(static struct file_operations fd_fops)を見てください。コールバック関数のテーブルです。デバイスの read と write には、カーネルが提供するデフォルトの関数が使われて おり、 register_blkdev() 関数で、ブロックデバイスの コールバック関数としてシステムに登録 されています。では、rd.c 独自の読み書きの機能はどのように 実現されているかというと、その直後で、 「リクエスト関数」という かたちで、ブロックデバイスごとに登録されています ( static void rd_request() の定義)。 バッファリング機能を各デバイスドライバに共通に 提供するために考え出された方法なのでしょうが、 いかにもあとから付けた感がぬぐえません。 残念無念。 そのリクエスト関数が肝心な処理に用いている CURRENT は何かというと、当該 デバイスに寄せられた、次に行なうべき処理のリクエストです (マクロ定義は ここ)。 デフォルトのブロックデバイス入出力関数が 用いる構造です。 リクエスト関数は、そのリクエストが read のものか write の ものかで処理を分岐し、用意されたバッファに対する 処理をするだけで、バッファリングその他の恩恵を 受けられるようになっています(ここを見てね)。 実際に rd.c が行っている処理は少しトリッキーですが、 コメントを見れば分かると思います。RAM ディスクは alloc() 系の関数で自ら領域を確保することもなければ、読み出し のときに memcpy() をすることもないのです。
| |||||