2024年6月14日发(作者:)

第一节 数据类型所占空间

当Linux内核在体系结构差异较大的平台之间移植时,会产生与数据类型相

关的问题。在编译内核时使用 -Wall -Wstrict-prototypes选项,可以避免很多

错误的发生。

内核使用的基本数据类型主要有:

Ø int

Ø u32

标准C语言整数类型;

32位整数类型;

特定内核对象pid的类型。 Ø pid_t

在不同的CPU体系结构上,C语言的数据类型所占空间不一样。下面是在x86

下数据类型所占的字节数:

arch

i686

char short int

1 2 4

long

4

ptr

4

long-long

8

u8

1

u16

2

u32

4

u64

8

下面是在其他平台上的数据类型所占的字节数:

arch

i386

alpha

armv4l

ia64

m68k

mips

ppc

sparc

char short int

1

1

1

1

1

1

1

1

2

2

2

2

2

2

2

2

2

4

4

4

4

4

4

4

4

4

long

4

8

4

8

4

4

4

4

4

ptr

4

8

4

8

4

4

4

4

4

long-long

8

8

8

8

8

8

8

8

8

u8

1

1

1

1

1

1

1

1

1

u16

2

2

2

2

2

2

2

2

2

u32

4

4

4

4

4

4

4

4

4

u64

8

8

8

8

8

8

8

8

8 sparc64 1

其中基于sparc64平台的Linux用户空间可以运行32位代码,用户空间指针

是32位宽的,但内核空间是64位的。

内核中的地址是unsigned long类型,指针大小和long类型相同。

内核提供下列数据类型。所有类型在头文件中声明,这个文件

又被头文件所包含。下面是include/asm/types.h文件。

#ifndef _I386_TYPES_H

#define _I386_TYPES_H

#ifndef __ASSEMBLY__

typedef unsigned short umode_t;

// 下面__xx类型不会损害POSIX 名字空间,在头文件使用它们,可以输出给用户空间

typedef __signed__ char __s8;

typedef unsigned char __u8;

typedef __signed__ short __s16;

typedef unsigned short __u16;

typedef __signed__ int __s32;

typedef unsigned int __u32;

#if defined(__GNUC__) && !defined(__STRICT_ANSI__)

typedef __signed__ long long __s64;

typedef unsigned long long __u64;

#endif

#endif /* __ASSEMBLY__ */

//下面的类型只用在内核中,否则会产生名字空间崩溃

#ifdef __KERNEL__

#define BITS_PER_LONG 32

#ifndef __ASSEMBLY__