8

Linux ブロック デバイス ドライバーを作成したいと考えています。ドライバーはハードウェアにアクセスする必要がないため、ユーザー空間に配置できます。

まず、この Makefile を使用してブロック デバイス ドライバーの例を作成してみました。

obj-m = sbd.o
KVERSION = $(shell pwd)
PWD = $(shell pwd)

all:
    make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules

ただし、修正方法がわからないこれらのエラーが発生します。標準出力と標準エラー出力は次のとおりです。

make -C /lib/modules/2.6.31-19-generic/build M=/home/andreas/sp/nivoa/src/driver/sbd modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.31-19-generic'
  CC [M]  /home/andreas/sp/nivoa/src/driver/sbd/sbd.o
/home/andreas/sp/nivoa/src/driver/sbd/sbd.c:72: error: expected ‘)’ before ‘*’ token
/home/andreas/sp/nivoa/src/driver/sbd/sbd.c:128: warning: initialization from incompatible pointer type
/home/andreas/sp/nivoa/src/driver/sbd/sbd.c: In function ‘sbd_init’:
/home/andreas/sp/nivoa/src/driver/sbd/sbd.c:143: error: ‘sbd_request’ undeclared (first use in this function)
/home/andreas/sp/nivoa/src/driver/sbd/sbd.c:143: error: (Each undeclared identifier is reported only once
/home/andreas/sp/nivoa/src/driver/sbd/sbd.c:143: error: for each function it appears in.)
/home/andreas/sp/nivoa/src/driver/sbd/sbd.c:146: error: implicit declaration of function ‘blk_queue_hardsect_size’
make[2]: *** [/home/andreas/sp/nivoa/src/driver/sbd/sbd.o] Error 1
make[1]: *** [_module_/home/andreas/sp/nivoa/src/driver/sbd] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-2.6.31-19-generic'
make: *** [all] Error 2

これに関する任意の助けをいただければ幸いです。

ありがとう、アンドレアス

4

5 に答える 5

13

ユーザー空間でブロックドライバーを実行する「正式な」方法はありませんが、NBD ドライバーを (ab) 使用して、ループバックネットワークを介して、通常のソケットでリッスンし、NBD プロトコルを話すデーモンと対話することによって、これを行うことがよくあります。詳細については、NBD ドキュメントを参照してください。

あなたの例は、カーネルモジュールとして構築する必要があるカーネルモードブロックデバイス用です。また、カーネルの内部構造は常に変化しているため、互換性がなくなっている可能性があります。

于 2010-02-16T07:36:54.317 に答える
7

MarkR の提案に従って、AF_UNIXソケット ペアを介して NBD プロトコルを使用することも可能であるため、追加のローカル デーモンは必要ありません。このプロトコルを実装するプログラムは、ソケット ペアを設定し、子をフォークする必要があります。親と子の両方がソケット ペアの一方の端を閉じます。そのうちの 1 つはソケットの端でリクエストの受け取りを開始し、もう 1 つは NBD ドライバーをソケットの端に接続します。

于 2010-10-14T07:49:56.423 に答える
4

常に最初のエラーを確認します。

あなたの場合、インクルード ファイルに問題があるように見えます。たとえば、request_queue_t が定義されていません。

これは非推奨のタイプであるため、コード例よりも新しいバージョンの linux/blkdev.h を使用している可能性があります。

追加してみるtypedef struct request_queue request_queue_t;

于 2010-02-15T15:34:06.287 に答える