曲径通幽论坛

标题: 可移植性和数据类型 [打印本页]

作者: beyes    时间: 2009-8-30 23:18
标题: 可移植性和数据类型
Linux 内核可以在多个平台上运行。为了确保平台上的可移植性,除了考虑平台之间的控制方式,还要明确变量的数据类型。

1、变量的数据类型

在 C 程序里,多数数据变量使用 int ,但是 int 型变量的大小依赖于平台。16 位微处理器中 int 型变量的大小为 2 字节,32 位微处理器中是 32 位,64 位微处理器中是 64 位。同样地,long 型的大小也随处理器的类型变化而变化。变量类型的大小差异会其他平台之间的移植带来负面的影响。为了解决此类问题,最好使用 Linux 内核提供的数据类型。对于现在较新的 2.6 内核中,在 include/asm-generic/int-l64.h 头文件中可以看到相应的数据类型定义,如:typedef unsigned char __u8;

常用的数据类型
带符号的正数
不带符号的正数
__s8, s8
 8位 
     __u8, u8
8位
__s16, s16
 16位
     __u16, u16
16位
__s32, s32
 32位
     __u32, u32
32位
__s64, s64
 64位
     __u64, u64
64位

应用程序中可以使用带两条下划线的变量类型,但是并不是说所有设备驱动程序都使用这些数据类型,但是如果考虑可移植性,最好还是使用内核提供的数据类型。
作者: beyes    时间: 2009-8-30 23:34
标题: 字节顺序
移植到其他平台时应注意正数字节顺序。存储正数数据时,不同的微处理器在内存中存放最小字节的位置也有所不同。有大端格式(big edian),小端格式(little endian)。

相关头文件位置(对于ARM平台):
arch/arm/include/asm/byteorder.h

其内容为
/*
*  arch/arm/include/asm/byteorder.h
*
* ARM Endian-ness.  In little endian mode, the data bus is connected such
* that byte accesses appear as:
*  0 = d0...d7, 1 = d8...d15, 2 = d16...d23, 3 = d24...d31
* and word accesses (data or instruction) appear as:
*  d0...d31
*
* When in big endian mode, byte accesses appear as:
*  0 = d24...d31, 1 = d16...d23, 2 = d8...d15, 3 = d0...d7
* and word accesses (data or instruction) appear as:
*  d0...d31
*/
#ifndef __ASM_ARM_BYTEORDER_H
#define __ASM_ARM_BYTEORDER_H

#ifdef __ARMEB__
#include <linux/byteorder/big_endian.h>        /*大端格式处理*/
#else
#include <linux/byteorder/little_endian.h>      /*小端格式处理*/
#endif

#endif





欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2