快速业务通道

linux/compile.h头文件说明

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-20

  所有的内核代码,基本都包含了linuxcompile.h这个文件,它是基础,打算先分析这个文件里的代码看看,有空再分析分析其它的代码.

  印入眼帘的是对__ASSEMBLY__这个宏的判断,这个变量实际是在编译汇编代码的时候,由编译器使用-D这样的参数加进去 的,AFLAGS这个变量也定义了这个变量,gcc会把这个宏定义为1.用在这里,是汇编代码里,不会用到类似于__user这样的属性(关于 __user这样的属性是怎么回子事,本文后面会提到),这样的属性是在定义函数的时候加的,这样避免不必要的在编译汇编代码时候的引用.

  接下来是一个对__CHECKER__这个宏的判断,这里需要讲的东西比较多.

  当 编译内核代码的时候,使用make C=1或C=2的时候,会调用一个叫Sparse的工具,这个工具对内核代码进行检查,怎么检查呢,就是靠对那些声明过Sparse这个工具所能识别的特 性的内核函数或是变量进行检查.在调用Sparse这个工具的同时,在Sparse代码里,会加上#define __CHECKER__ 1的字样.换句话说,就是,如果使用Sparse对代码进行检查,那么内核代码就会定义__CHECKER__宏,否则就不定义.

  这里就能看出来,类似于__attribute__((noderef, address_space(1)))这样的属性就是Sparse这个工具所能识别的了.

  那么这些个属性是干什么用的呢,我一个个做介绍.

  这 样的属性说明,有一部分在gcc的文档里还没有加进去,至少我在gcc 4.3.2的特性里没有看到,网上有哥们问类似的问题,Greg对他进行了解答,然后他对Greg抱怨文档的事,Greg对他说,他有时间抱怨的话,还不 如自己来更新文档.他不能对一个免费工具的文档有如此之高的要求,除非他付费.

  # define __user __attribute__((noderef, address_space(1)))

  __user这个特性,即__attribute__((noderef, address_space(1))),是用来修饰一个变量的,这个变量是非解除参考(no dereference)的,即这个变量地址是有效的,变量所在的地址空间是1,即用户程序空间的.

  这里把程序空间分成了3个部分,0表示normal space,即普通地址空间,对内核代码来说,当然就是内核空间地址了.1表示用户地址空间,这个不用多讲,还有一个2,表示是设备地址映射空间,例如硬件设备的寄存器在内核里所映射的地址空间.

  在内核函数里,有一个copy_to_user的函数,函数的参数定义就使用了这种方式.当然,这种特性检查,只有当机器上安装了Sparse这个工具,进行了编译的时候调用,才能起作用的.

  # define __kernel /* default address space */

  根据定义,就是默认的地址空间,即0,我想定义成__attribute__((noderef, address_space(0)))也是没有问题的.

  # define __safe __attribute__((safe))

  这个定义在sparse里也有,内核代码是在2.6.6-rc1版本变到2.6.6-rc2的时候被Linus加入的,经过我的艰苦的查找,终于查找到原因了,知道了为什么Linus要加入这个定义,原因是这样的:

  有人发现在代码编译的时候,编译器对变量的检查有些苛刻,导致代码在编译的时候老是出问题(我这里没有去检查是编译不通过还是有警告信息,现在的编译器已经不是当年的编译器了,代码也不是当年的代码).比如说这样一个例子,

  int test( struct a * a, struct b * b, struct c * c ) {

  return a->a b->b c->c;

  }

  这个编译的时候会有问题,没有检查参数是否为空,就直接进行调用.但是呢,在内核里,有好多函数,当它们被调用的时候,这些个参数必定不为空,根本用不着去对这些个参数进行非空的检查,呢,就增加了一个__safe的属性,如果这样声明变量,

  int test( struct a * __safe a, struct b * __safe b, struct c * __safe c ) {

  return a->a b->b c->c;

  }

  编译就没有问题了.

  不过

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号