![](/img/trans.png)
[英]how to assign 64 bit unsigned long long to 32 bit structure in 32 bit architecture
[英]Confusion in structure member alignment in 32 bit and 64 bit architecture
在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位长的位域)。
我将完全重组该结构。 首先,按大小排序内容(从大到大)。 使用包装,使用在stdint.h中声明的类型。 例如,保证int32_t
在每个体系结构上都具有32位。
如果您无法控制该结构并且无法对其进行更改,请对调试所使用的内存布局进行反向工程,然后在您的应用程序中设计一个类似于给定结构的结构。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.