types.h头文件纵观,就可以看出是对一些数据类型的重命名或者是定义,以及对DMA通用地址的定义以及其64为的特性。下面是types.h头文件的源代码,主要的学习内容都在注释当中。
#ifndef _I386_TYPES_H#define _I386_TYPES_H#ifndef __ASSEMBLY__/** * 纵观这个头文件,发现该头文件主要是用来给 * 定义类型以及给类型重新命名的 *///将unsigned short 重命名为 umode_ttypedef 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_HIGHMEM64Gtypedef u64 dma_addr_t;#elsetypedef u32 dma_addr_t;#endiftypedef u64 dma64_addr_t;#ifdef CONFIG_LBDtypedef u64 sector_t;#define HAVE_SECTOR_T#endif#ifdef CONFIG_LSFtypedef u64 blkcnt_t;#define HAVE_BLKCNT_T#endif#endif /* __ASSEMBLY__ */#endif /* __KERNEL__ */#endif