繁体   English   中英

32位和64位架构中的结构成员对齐混乱

[英]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位应用程序之间共享数据结构时,还有其他已知问题吗?

我完全不相信该结构的内存布局。 它没有声明为压缩的,它具有intshort部件,几乎每个建筑都具有不同的大小。 位域也具有依赖于编译器的捕获(我过去使用的一个编译器仅允许8位长的位域)。

我将完全重组该结构。 首先,按大小排序内容(从大到大)。 使用包装,使用在stdint.h中声明的类型。 例如,保证int32_t在每个体系结构上都具有32位。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM