types.h头文件纵观,就可以看出是对一些数据类型的重命名或者是定义,以及对DMA通用地址的定义以及其64为的特性。下面是types.h头文件的源代码,主要的学习内容都在注释当中。
#ifndef _I386_TYPES_H
#define _I386_TYPES_H
#ifndef __ASSEMBLY__
/**
* 纵观这个头文件,发现该头文件主要是用来给
* 定义类型以及给类型重新命名的
*/
//将unsigned short 重命名为 umode_t
typedef unsigned short umode_t;
/*
* __xx is ok: it doesn‘t pollute the POSIX namespace. Use these in the
* header files exported to user space
*
* __xx也是可以的。他不会影响POSIX命名空间。在导出到用户空间的头文件中
* 使用这些名称.
*
*/
//重命名有符号的char和无符号的char
//可以这样去理解,由于一个char占用一个字节的长度,
//也就是8位,所以才会这样去命名
typedef __signed__ char __s8;
typedef unsigned char __u8;
//重新命名有符号的short和无符号的short
//short类型占有2个字节的长度,也就是16位
typedef __signed__ short __s16;
typedef unsigned short __u16;
//重命名有符号的int和无符号的int
//int类型占有四个字节的长度,即32位
typedef __signed_ /* __KERNEL__ */_ int __s32;
typedef unsigned int __u32;
//在定一个__GNUC__和没有定义__STRICT_ANSI__下
//来重命名long
//long占有8个字节的长度,64位
#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
typedef __signed__ long long __s64;
typedef unsigned long long __u64;
#endif
#endif /* __ASSEMBLY__ */
/*
* These aren‘t exported outside the kernel to avoid name space clashes
*
* 为了避免命名空间冲突,这些将不会导出到内核外面
*/
#ifdef __KERNEL__
//一个宏定义,定义BITS_PER_LONG
//为32
#define BITS_PER_LONG 32
//在没有定义__ASSEMBLY__的情况下
#ifndef __ASSEMBLY__
//同上
typedef signed char s8;
typedef unsigned char u8;
typedef signed short s16;
typedef unsigned short u16;
typedef signed int s32;
typedef unsigned int u32;
typedef signed long long s64;
typedef unsigned long long u64;
/* DMA addresses come in generic and 64-bit flavours. */
//定义DMA通用地址和64位特性
#ifdef CONFIG_HIGHMEM64G
typedef u64 dma_addr_t;
#else
typedef u32 dma_addr_t;
#endif
typedef u64 dma64_addr_t;
#ifdef CONFIG_LBD
typedef u64 sector_t;
#define HAVE_SECTOR_T
#endif
#ifdef CONFIG_LSF
typedef u64 blkcnt_t;
#define HAVE_BLKCNT_T
#endif
#endif /* __ASSEMBLY__ */
#endif /* __KERNEL__ */
#endif
原文地址:http://blog.csdn.net/hongbochen1223/article/details/45117739