编写设备驱动程序

检查 x86 平台上 64 位 Long 数据类型的结构

您应认真检查 x86 平台上使用 64 位 long 类型(如 uint64_t)的结构。32 位模式编译与 64 位模式编译的对齐方式和大小可能不同。请参考以下示例。

#include <studio>
#include &ltsys>

struct myTestStructure {
        uint32_t        my1stInteger;
        uint64_t        my2ndInteger;
};

main()
{
        struct myTestStructure a;

        printf("sizeof myTestStructure is: %d\n", sizeof(a));
        printf("offset to my2ndInteger is: %d\n", (uintptr_t)&a.bar - (uintptr_t)&a);
}

在 32 位系统中,该示例显示以下结果:


sizeof myTestStructure is: 12
offset to my2ndInteger is: 4

而在 64 位系统中,该示例显示以下结果:


sizeof myTestStructure is: 16
offset to my2ndInteger is: 8

因此,32 位应用程序与 64 位应用程序对结构的理解不同。这样,尝试在 32 位和 64 位两种环境中使用同一结构可能会导致问题。这种情况经常发生,尤其是在通过 ioctl() 调用将结构传入或传出内核的情况下。