Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 32位和64位体系结构中的结构成员对齐混乱_C_Linux_Gcc_Linux Kernel - Fatal编程技术网

C 32位和64位体系结构中的结构成员对齐混乱

C 32位和64位体系结构中的结构成员对齐混乱,c,linux,gcc,linux-kernel,C,Linux,Gcc,Linux Kernel,在64位linux内核中运行32位应用程序(用C编写)时,我面临一些问题。相同的应用程序在32位内核中运行时没有任何问题 在花了大量时间调试之后,画面变得更加清晰了。用户空间应用程序和内核模块之间有一个共享的结构。从用户空间传递到内核空间时,结构变量中成员的值会损坏 这是结构的防御 struct entry { unsigned active:1; unsigned strict:1; unsigned AB_is_ipv6:1; unsigned XY_is_i

在64位linux内核中运行32位应用程序(用C编写)时,我面临一些问题。相同的应用程序在32位内核中运行时没有任何问题

在花了大量时间调试之后,画面变得更加清晰了。用户空间应用程序和内核模块之间有一个共享的结构。从用户空间传递到内核空间时,结构变量中成员的值会损坏

这是结构的防御

struct entry
{
    unsigned active:1;
    unsigned strict:1;
    unsigned AB_is_ipv6:1;
    unsigned XY_is_ipv6:1;
    unsigned srtp_sideA_en:2;
    unsigned srtp_sideB_en:2;
    unsigned srtp_mki_sideA_en:2;
    unsigned srtp_mki_sideB_en:2;
    unsigned cnt_fdnat, cnt_fsnat, cnt_rdnat, cnt_rsnat;
    unsigned short Apt, Bpt, Xpt, Ypt;
    unsigned int err[2];
};
两个位字段srtp_mki_sideA_en和srtp_mki_sideB_en的值经常损坏

当共享结构中有位字段成员时,这样的共享结构有什么问题吗

在共享数据结构时,32位和64位体系结构中的成员对齐是否存在可能导致内存损坏的差异


在64位内核和32位应用程序之间共享数据结构时,还有其他已知问题吗?

我根本不相信该结构的内存布局。它没有声明为打包的,它有
int
short
部分,几乎每个建筑都有不同的大小。此外,位字段还具有依赖于编译器的捕获(我过去使用的一个编译器只允许8位长的位字段)

我会彻底重组结构。首先,按大小排序内容(最大优先)。使用包装,使用标准h中声明的类型<例如,code>int32_t保证每个体系结构上有32位


如果您无法控制结构并且无法更改它,请对调试使用的内存布局进行反向工程,然后在应用程序中创建一个类似于给定结构的结构

如果在64位内核和32位程序中打印结构的大小,是否相同?如果不是,那么您需要打包结构或添加手动填充以对齐在64位和32位上工作的成员,或者简单地提出一个不需要传递二进制结构的解决方案。首先,位字段是一个非常糟糕的主意。