【发布时间】:2017-09-10 06:10:13
【问题描述】:
使用 Visual Studio 2015 处理内核驱动程序项目。我注意到这种事情正在发生;
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 出于某种原因正在做的对齐事情,但由于第一次调用是正确的,所以它更加令人困惑,然后它决定在第二次调用时搞砸了。这似乎是一件非常糟糕的事情。该结构在制作时考虑了对齐,os_lock 为 +0x338 英寸。
我可以在该结构周围抛出#pragma pack(8) 来阻止它,但它似乎发生在很多其他地方,它需要停止:) 我无法想象 VS2015 会如此随机,所以它一定是我设法做的事情。
【问题讨论】:
标签: c windows visual-studio-2015 kernel alignment