1

カーネル経由でブロック レベルのストレージにアクセスする方法 (scsi ライブラリを使用しない場合)?

私の意図は、SCSI が機能するのとほぼ同じように、学習目的でネットワーク上にブロック レベルのストレージ プロトコルを実装することです。要求はイニシエーターによって生成され、カーネル モジュールを呼び出して、TCP プロトコルを使用してデータをイニシエーターに返すターゲット (両方のユーザー空間プログラム) に送信されます。

これまでのところ、単純な「Hello」モジュールを作成して実行することができましたが (カーネル プログラミングは初めてです)、ブロック アクセスを続行できません。

いろいろ検索したところ、 で見つかりましstruct buffer_head * bread(int dev,int block)linux/fs.hが、コンパイラがエラーをスローします。

 error: implicit declaration of function ‘bread’

助けてください。また、カーネルプログラミングを始める際のアドバイスもお気軽に。
ありがとうございました!


bread古いカーネルで使用されているように。

struct request *blk_get_request(struct request_queue *, int, gfp_t);中をのぞくlinux/blkdev.h


ブロック デバイスへのアクセスは、カーネル経由で行う必要があります。

4

1 に答える 1

0

カーネル開発者ではありませんが、いくつかのコメント:

  • 暗黙の宣言エラーは、関数を呼び出すときに、何らかの形で見つけた定義がスコープ内にないことを意味します。に隠されている#ifdefか、linux/fs.h何らかの理由で含めるのを忘れている可能性があります。

  • Linux カーネル プログラミングに関するアドバイスについては、kernelnewbies.orgを参照してください。

  • カーネル プログラミングについてはさまざまな本が書かれていますが、カーネルの詳細は急速に変化していることに注意してください。古い本の概念のほとんどはまだ有効ですが、少なくとも一部の領域の詳細の一部が変更されています。

  • 最後に、勇気を持って Linux カーネルのメーリング リストに参加する必要があるかもしれません。申し訳ありませんが、質問を投稿する前によく考えてみてください。

  • ブロック レベルのストレージ プロトコルは、それ自体がかなりの作業です。たとえば、/dev/sdcカーネルに飛び込む前に、ターゲットが直接アクセスするように、最初にユーザー空間にプロトコルを配置したい場合があります。

あなたの質問を詳しく読むと、あなたの主な関心はこのプロジェクトのストレージ プロトコルの側面にあるようです。もしそうなら、なぜカーネルを変更する必要があるのですか? たとえば/dev/sdX、ターゲットにローカルに接続されたディスクがある場合、ユーザー空間から次のようなことができます。

fd = open("/dev/sdX", O_RDWR);
pwrite(fd, buf, len, offset);
pread(fd, buf, len, offset);

したがって、カーネル内で遊ぶことに特に興味がない限り、ユーザー プロセス間で基本的なストレージ プロトコルを実行するためにカーネル モジュールを実行する必要はないと思います。

于 2010-04-25T00:30:40.203 に答える