最近做一个移植项目,将32位上的VPN移植到64位环境上。由于当初设计未考虑可移植性,导致移植时出现了很多的问题,其中最典型的一个问题就是通信结构带指针的问题。
场景分析:
如下的两个结构体,其中B在通信时做通信结构使用
struct A
{
int count; //链表结点数
int *b; //数据链表
void* setPoint(void *p)//设置指针,传入起始指针,返回结束指针
{
return (int*)p + count;
}
}
struct B
{
int count; //链表结点数
A *y; //A结构链表
void* setPoint(void *p) //设置指针,传入起始指针,返回结束指针
{
return (A*)p+count;
}
}
乍一看是不是很乱呢,确实,之所以在通信时使用这样的结构,是为了传送链表数据用的,也就是不固定的数据单元。
这里就不深入讨论这个结构的内存布局了,简单说一下,内存布局分为头部和尾部,头部为结构体数据,尾部为结构体所包含的链表数据。
移植分析

在将32位软件移植到64位环境时,遇到指针长度不兼容的问题。文章分析了通信结构体中的指针在32位和64位下的差异,并提出两种解决方法:一是创建32位兼容结构体,用整型代替指针,但会增加解码和编码的工作量;二是自定义指针类,利用偏移量模拟32位指针,实现兼容性。最后给出了64位环境下模拟32位指针的简单实现。

372

被折叠的 条评论
为什么被折叠?



