[私はデバイス ドライバー プログラミングの初心者なので、しばらくお待ちください]
キャラクター デバイス ドライバーを作成しており、ドライバーに割り当てられたメモリの一部をユーザー空間にマップしようとしています。
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() に実際にアドレスを入力する以外に方法はありますか?