【问题标题】:VS2015 Pointers keep changing, alignment?VS2015 指针不断变化,对齐?
【发布时间】: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


    【解决方案1】:

    哈,世界又恢复了理智。结果发现其中一个头文件具有#pragma pack(4) 以使传递到内核的用户空间结构相同,但头文件以#pragma push() 结尾-不确定大脑在那里做什么,但git commit 是在凌晨1 点。

    因此,根据哪些文件包含所述标题,哪些没有,pack 是 4 或 8。当然让事情变得有趣。让我们把它归结为 PEBCAK 的人,抱歉打扰了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-16
      • 1970-01-01
      • 2017-10-02
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      相关资源
      最近更新 更多