![](/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.