3

PCIe デバイス ドライバーを作成しましたが、読み取り/書き込み機能が正しく動作しません。デバイスには、0x10800000、0x0c000000、および 0x80000000 で始まる 3 つのメモリ領域があります。テスト目的で、ドライバーの読み取りおよび書き込み関数は、渡されたアドレスを出力して返します。ユーザー空間アプリから pread() または pwrite() を呼び出すと、最初の 2 つのメモリ領域に渡されたアドレスが表示されますが、3 番目のメモリ領域を呼び出すと、渡されたように何も表示されません。ドライバーの読み取りまたは書き込み関数を入力することさえできません。

私のドライバーは、Linux バージョン 2.6.32 を実行している 64 ビット マシンで完全に正常に動作します。動作しないこの別のマシンは、Linux バージョン 2.6.25 を実行する 32 ビット マシンです。私の考えでは、32 ビットは 0x80000000 アドレスが気に入らないのではないかと思いますが、それを確認する方法や、その場合の修正方法がわかりません。

4

1 に答える 1

1

これは非常に漠然とした質問です (どのファイルで pread/pwrite を行っているのですか?) が、すべてが 64 ビットで動作し、ドライバーが 32 ビットで呼び出されないと言うので、問題はのサイズoff_tと 0x80000000 が 32 ビットをオーバーフローし、巨大な負の数になるという事実。

あなたが置くとどうなりますか

  #define _FILE_OFFSET_BITS 64

ユーザー空間のソースコードの最初の行として? (または、gcc コマンドラインで「-D_FILE_OFFSET_BITS=64」を渡します)?

于 2012-09-07T22:43:45.120 に答える