新トップページ ...

旧トップページ

Linux 日記
  Linux日記08~
  Linux日記2006
  Linux日記2005
  Linux日記2004
  Linux日記2003
  Linux日記2002
  Linuxカーネル
  + メモ ... (3p)
   勉強会
    第〇回
    第一回・予習
    第一回
    第二回・予習
    第二回
    カーネルparamsのR/W

アートでいこう(笑)!
  イラスト日記08〜
  イラスト日記2005
  イラスト日記2004
  イラスト日記2003
  アイコン描こうぜ

UCC(梅丘自転車部)
  活動ログ2003
  活動ログ2001
  活動ログ2000
  その他
  ワシの愛車

自動車関連
  FD3S日記05~
  S202日記2004
  S202日記2003
  S202日記2002
  S202給油等記録
  S202掲示板 (7dy)

自宅前カメラ
EZweb/PCSV用
プロフィール
社会科ノート 2004
社会科ノート 2003
全角半角変換
自家用リンク
視聴予定表
メモ

W/O index
第二回・予習: RAM ディスクのドライバ

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() をすることもないのです。



- ご意見・ご要望は、サイト管理者(那賀樹一郎 (Kiichiro NAKA) <knaka@ayutaya.com>)までお願いします。
- このサイトは、Turbolinux 上の Mozilla w3m でテストされています。Internet Explorer では未確認です
- 言うまでもありませんが、当サイトはリンクフリーです
- W3C の HTML チェックをかけたところ、ズタボロでした。頑張ったけど、ダメだこりゃ……