簡體   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