64位平台转32位平台总结

来源:互联网 发布:网络攻击与防范 ppt 编辑:程序博客网 时间:2024/05/16 07:35

64位平台转32位平台总结

 

        一般都是32位平台转到64位平台,可是我们刚好相。我们公司最近做的分布式文件系统,以前是在64位平台下代码,以为现在的服务器很少有32位平台,也就没有过多的考虑,现在由于客户需要,不得不修改至32位平台。

         现在总结如下,共大家学习。

        

1)       数据类型的定义

一般我们都用typedef 定义数据类型

typedef  unsigned char   aol_u8_t;

typedef  char            aol_s8_t;

typedef  unsigned short  aol_u16_t;

typedef                short  aol_s16_t

typedef  unsigned int    aol_s32_t

typedef          int    aol_u32_t

typedef  unsigned long   aol_u64_t

typedef          long   aol_s64_t

 

这里最大的失误是:把64位定义成了long ,这就导致在32位平台上,64位定义成了32位。同时到处打印信息

printk(“ino: %lu /n”) 修改为

printk(“ino: %llu /n”)

 

typedef  unsigned long long  aol_u64_t

typedef          long long   aol_s64_t

 

 

2)       atomic64_t 的修改

64位中,atomic_64_t的实现是long类型,64位,而在32位中没有这样的相应的类型。

这是因为在atomic_t 的实现是汇编语言,前面加了LOCK_PREFIX

3)        同样的位设置操作,其类型是void* 类型,指针类型,在64位平台上是64位的,在32平台位上是32位。

由于我们在代码中定义位一般用来标识flag,一般定义成了

aol_u32_t  flag;

或者定义成

aol_u64_t  flag; 回导致问题产生。

 

修改的意见是:

unsigned long flag;

static __inline__ void set_bit(int nr, volatile void * addr)
{
        __asm__ __volatile__( LOCK_PREFIX
                "btsl %1,%0"
                :"=m" (ADDR)
                :"Ir" (nr));
}

4)       Kmap的使用

由于在64位平台上,没有高端内存,也就是当获取一个page描述符指针,要获取其虚拟地址是,是直接通过page_address获取的

 char* addr= page_address(page);

 

这在32位平台上如果是高端内存,我们知道是需要通过映射的:

 char* addr = kmappage;

当使用完时,需要释放:

 kunmap(page);

 

还有一个问题需要注意的是: kmap的次数是有限制的,这是因为在高端内存的永久映射里面,只保留了4M的虚拟地址空间,所以只能映射1024个页面,当没有可以的虚拟地址时, kmap函数是可以睡眠的,直到有可以的虚拟地址。所以kmap使用一次不能超过1024个,负责会导致死锁。