欢迎来到天天文库
浏览记录
ID:44588485
大小:218.43 KB
页数:26页
时间:2019-10-23
《【精品】Linux内核分析及编程》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、第一节数据类型所占空间当Linux内核在体系结构差异较大的平台Z间移植时,会产生与数据类型相关的问题。在编译内核时使用-Wall-Wstrict-prototypes选项,可以避免很多错误的发生。内核使用的基本数据类型主要有:0>int标准C语言整数类型;0>u3232位整数类型;pid_t特定内核对象pid的类型。在不同的CPU体系结构上,C语言的数据类型所占空间不一样。下面是在x86下数据类型所占的字节数:archcharshortintlongptrIong-longu8u16u32u64i6861244481248下血是在其他平台上的数据类型所占的字节数:archcharshorti
2、ntlongptrlong-longu8u16u32u64i3861244481248alpha1248881248armv4l1244481248ia641248881248m68k1244481248mips1244481248PPG1244481248spare1244481248sparc641244481248其中基于sparc64平台的Linux用户空间可以运行32位代码,用户空间指针是32位宽的,但内核空间是64位的。内核中的地址是unsignedlong类型,指针大小和long类型相同。内核提供下列数据类型。所有类型在头文件+声明,这个文件又被头文件
3、所包含。下面是include/asm/types,h文件。#ifndef_I386_TYPES_H#ifndefASSEMBLY.typedefunsignedshortumode_t;〃下面_xx类型不会损啻POSIX名字空间,在头文件使它们,可以输出给用户空间typedef_signed_char_s8;typedefunsignedchar_u8;typedef_signed_short_sl6;typedefunsignedshort_ul6;typedef_signed_int_s32;typedefunsignedint_u32;#ifdefined
4、(_QNUC_)&&!defined(—STRICT_ANSI_)typedef_signed_longlong_s64;typedefunsignedlonglong_u64;#endif#endif/*_ASSEMBLY—*///下面的类型只用在内核中,否则会产生名字空间崩溃#ifdef—KERNEL_^defineBITS_PER_LONG32#ifndefASSEMBLY#includetypedefsignedchars8;typedefunsignedcharu8;typedefsignedshortsl6;typedefunsignedshort
5、ul6;typedefsignedints32;typedefunsignedintu32;typedefsignedlonglongs64;typedefunsignedlonglongu64;/*DMAaddressescomeingenericand64-bitflavours・#ifdefCONFIG_HIGHMEM64Gtypedefu64dma_addr_t;#elsetypedefu32dma_addr_t;#endiftypedefu64dma64_addr_t;#ifdefCONFIG_LBDtypedefu64sector_t;^defineHAVE_SECTOR_T#e
6、ndif#endif/*_ASSEMBLY_*/#endif/*—KERNEL—*/#endif卜•面是Linux/types-h的部分定义。Sifndef_LINUX_TYPES_H#define_LINUX_TYPES_H#ifdef—KERNEL_//这个宏定义必须在^includeZ前^include#defineBITS_TO_LONGS(bits)(((bits)+BITS_PER_LONG-/BITS_PER_LONG)#defineDECLARE_BITMAP(name,bits)unsignedlongname[
7、BITS_TO_LONGS(bits)]#endif^include#inuludeu8;/*unsignedbyte(8bits)*/ul6;/*unsignedword(16bits)*/u32;/*unsigned32-bit.value*/使用有前缀的类型用于将变量显露给用户空间,如u8类型。例如:一个驱动程序通过ioctl函数与运行
此文档下载收益归作者所有