2017-04-14 5 views
1

Visual Studio 2015で、カーネルドライバプロジェクトで作業します。私はこの種のことが起こっていることに気付いた。VS2015ポインターの変更、アラインメントは維持されますか?

dprintf("os %p; os_lock %p\n", os, &os->os_lock); 
mutex_init(&os->os_lock); 
mutex_enter(&os->os_lock); 

void mutex_init(kmutex_t *mp) { 
    dprintf("%s is %p\n", __func__, mp); 
    ... 

void mutex_enter(kmutex_t *mp) { 
    dprintf("%s is %p\n", __func__, mp); 
    ... 

os 0xffffa08b29041ac0; os_lock 0xffffa08b29041df8 
mutex_init is 0xffffa08b29041df8 
mutex_enter is 0xffffa08b29041df0 <--- 

そこで何が起こったのですか?確かに、それは何らかの理由でVS2015がやっていることですが、最初の呼び出しが正しかったので余分に混乱しています。それが2番目に混乱することにします。それはちょうど本当に悪いもののように思えます。構造体を念頭に合わせて作られた、とos_lockは+で0x338です。

私はそれを停止するために、その構造体の周りに#pragma pack(8)を投げることができますが、かなりの数の他の場所で起こっているようだ、停止する必要があります:)私はVS2015がこのランダムであると想像することはできませんので、私は何かすることができなければなりません。

答えて

0

もう、世界は元気です。ヘッダーファイルの1つを#pragma pack(4)とし、カーネルに渡されるユーザーランド構造体を同じにしますが、ヘッダーファイルは#pragma push()で終了しました。脳が何をしているのかは分かりませんが、git commitは1amでした。

したがって、上記のヘッダーに含まれているファイルによって異なりますが、パックに含まれていないファイルは4または8のいずれかです。これをPEBCAKの人々に伝えましょう、雑音をおかけして申し訳ありません。

関連する問題