1

[私はデバイス ドライバー プログラミングの初心者なので、しばらくお待ちください]

キャラクター デバイス ドライバーを作成しており、ドライバーに割り当てられたメモリの一部をユーザー空間にマップしようとしています。

init_module() 関数では、次のようなバッファ スペースを割り当てます -

buf = (char*)vmalloc_user(SIZE_OF_BUFFER);

buf はいくつかのアドレスを指すようになりました。

ここで、ドライバーの mmap 関数で、VM_RESERVED フラグを設定し、呼び出します。

remap_vmalloc_range(vma, (void*)buf, 0);

次に、正しいメジャー番号で /dev にキャラクター デバイス ファイルを作成します。

ここで、ユーザー空間に簡単なプログラムを作成してキャラクター デバイス ファイルを開き、mmap() を呼び出して、この mmap されたメモリからデータを読み取ります。

ユーザー空間での mmap() の呼び出しで、領域の開始アドレスを渡すことができるオプションがあることを知っています。しかし、ユーザー空間の mmap がドライバー空間の buf と同じアドレスを指す方法はありますか?

ドライバー空間の buf のアドレスが、ユーザー空間の mmap() によって返されるアドレスと異なるため、ユーザー空間プログラムがジャンク値を読み取ってしまうと思います。この問題を解決するには、ユーザー空間の mmap() に実際にアドレスを入力する以外に方法はありますか?

4

1 に答える 1

2

ユーザー空間のマップ アドレスが問題にならないように、ドライバー インターフェイスを設計する必要があります。これは、たとえば、単一のユーザー空間プロセスの外部でアクセスされる mmap 領域にポインターを格納しないことを意味します。

通常、完全なポインターではなく、ベース マップ アドレスからのオフセットを格納します。カーネル ドライバーとユーザー空間コードは、これらのオフセットをベース ポインターに追加し、それぞれのコンテキストに適した仮想アドレスを取得できます。

于 2012-11-02T01:05:47.147 に答える