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类型相同。
内核提供下列数据类型。所有类型在头文件
又被头文件
#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__


发布评论