linux/compile.h头文件说明
我在现在的代码里没有发现有使用__safe这个定义的地方,不知道是不是编译器现在已经支持这种特殊的情况了,就不用再加这样的代码了.
# define __force __attribute__((force)) 表示所定义的变量类型是可以做强制类型转换的,在进行Sparse分析的时候,是不用报告警信息的. # define __nocast __attribute__((nocast)) 这里表示这个变量的参数类型与实际参数类型一定得对得上才行,要不就在Sparse的时候生产告警信息. # define __iomem __attribute__((noderef, address_space(2))) 这个定义与__user, __user是一样的,只不过这里的变量地址是需要在设备地址映射空间的. # define __acquires(x) __attribute__((context(x,0,1))) # define __releases(x) __attribute__((context(x,1,0))) 这是一对相互关联的函数定义,第一句表示参数x在执行之前,引用计数为0,执行后,引用计数为1,第二句则正好相反,这个定义是用在修饰函数定义的变量的. # define __acquire(x) __context__(x,1) # define __release(x) __context__(x,-1) 这是一对相互关联的函数定义,第一句表示要增加变量x的计数,增加量为1,第二句则正好相反,这个是用来函数执行的过程中. 以上四句如果在代码中出现了不平衡的状况,那么在Sparse的检测中就会报警.当然,Sparse的检测只是一个手段,是静态检查代码的手 段,它的帮助有限,有可能把正确的认为是错误的而发出告警.要是对以上四句的意思还是不太了解的话,请在源代码里搜一下相关符号的用法就能知道了.这 第一组与第二组,在本质上,是没什么区别的,只是使用的位置上,有所区别罢了.
# define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0) 这句话的意思就是条件锁.当c这个值不为0时,则让计数值加1,并返回值为1.不过这里我有一个疑问,就是在这里,有一个__cond_lock定 义,但没有定义相应的__cond_unlock,那么在变量的释放上,就没办法做到一致.我查了一下关于spin_trylock()这个函数的定 义,它就用了__cond_lock,里面又用了_spin_trylock函数,在_spin_trylock函数里,再经过几次调用,就会使用到 __acquire函数,这样的话,相当于一个操作,就进行了两次计算,会导致Sparse的检测出现告警信息,经过我写代码进行实验,验证了我的判断, 确实是会出现告警信息,如果我写两遍unlock指令,就没有告警信息了,但这是与程序的运行是不一致的. extern void __chk_user_ptr(const volatile void __user *); extern void __chk_io_ptr(const volatile void __iomem *); 这两句比较有意思.这里只是定义了函数,但是代码里没有函数的实现.这样做的目的,就是在进行Sparse的时候,让Sparse给代码做必要的参数类型检查,在实际的编译过程中,并不需要这两个函数的实现. #define notrace __attribute__((no_instrument_function)) 这一句,是定义了一个属性,这个属性可以用来修饰一个函数,指定这个函数不被跟踪.那么这个属性到底是怎么回子事呢?原来,在gcc编译器里面,实 现了一个非常强大的功能,如果在编译的时候把一个相应的选择项打开,那么就可以在执行完程序的时候,用一些工具来显示整个函数被调用的过程,这样就不需要 让程序员手动在所有的函数里一点点添加能显示函数被调用过程的语句,这样耗时耗力,还容易出错.那么对应在应用程序方面,可以使用Graphviz这个工 具来进行显示,至于使用说明与软件实现的原理可以自己在网上查一查,很容易查到.对应于内核,内核一直是在运行阶段,就不能使用这套东西了,内核 是在自己的内部实现了一个ftrace的机制,编译内核的时候,如果打开这个选项,那么通过挂载一个debugfs的文件系统来进行相应内容的显示,具体 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |