2

カーネルモードドライバーを実行していますが、64ビットでコードを実行すると少しバグが発生しました。

コードは32ビットで正常に実行されますが、amd64でビルド/実行すると、奇妙な結果が得られます。私は64ビットポインタとアドレス指定vs32ビットvs16ビット(win32)について少し読みましたが、64ビットアーキテクチャのポインタの基本について何かが欠けていると確信しています。

これは、32ビットで問題なく動作するCコードです。 ncImageLoadEventSettings.buffはachar*であり、ncILHead->count単にintです。

// Calculate offset
    pnt = (void*)(ncImageLoadEventSettings.buff + sizeof(struct NC_IL_HEAD) + (ncILHead->count * sizeof(struct NC_IL_INFO)));

このコードは、構造体オブジェクトをバッファー(で始まる.buff)に書き込むアドレスを計算します。これは、32ビットモードで完全に正常に機能します。

このバッファを読み取るプログラムは32ビットであることに注意してください。64ビットモードの構造体は32ビットモードの構造体とはサイズが異なることをどこかで読んだと思います。

32ビットリーダープログラムは、バッファの内容の一部を正常に読み取りますが、エントリの大部分はガベージです。

これはアドレスを計算するための適切な方法ですか、それともそのバッファーを読み取っている64ビットと32ビットのリーダーアプリケーションに問題があるのでしょうか。

4

1 に答える 1

1

http://en.wikipedia.org/wiki/Data_structure_alignment#Typical_alignment_of_C_structs_on_x86を参照してください

一般に、ポインターはより大きく(64ビット)、64ビットサイズのほとんどのフィールド(ポインターを含む)は整列されます(パディングが追加されます)。

于 2012-06-12T07:12:53.583 に答える