1. ASSEMBLY
关于__attribute__
的宏定义在include\linux\compiler_types.h
文件中,首先是宏__ASSEMBLY__
,这是在编译阶段使用-D
加上去的,也就是-D__ASSEMBLY__
,AFLAGS
这个变量也定义了这个变量:如下:
$ grep AFLAGS `find -name Makefile` | grep __ASSEMBLY__
./arch/powerpc/boot/Makefile:BOOTAFLAGS := -D__ASSEMBLY__ $(BOOTCFLAGS) -nostdinc
./arch/powerpc/platforms/cell/spufs/Makefile:SPU_AFLAGS := -c -D__ASSEMBLY__ -I$(srctree)/include -D__KERNEL__
./arch/mips/boot/compressed/Makefile:KBUILD_AFLAGS := $(KBUILD_AFLAGS) -D__ASSEMBLY__ \
./arch/arm64/kernel/vdso32/Makefile:VDSO_AFLAGS += -D__ASSEMBLY__
./arch/x86/boot/Makefile:KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__
./arch/x86/boot/compressed/Makefile:KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__
./arch/x86/realmode/rm/Makefile:KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__
./arch/s390/Makefile:KBUILD_AFLAGS_DECOMPRESSOR := $(CLANG_FLAGS) -m64 -D__ASSEMBLY__
./Makefile:KBUILD_AFLAGS := -D__ASSEMBLY__ -fno-PIE
用在这里,是因为汇编代码里,不会用到类似于__user这样的属性(关于__user这样的属性是怎么回子事,本文后面会提到),因为这样的属性是在定义函数的时候加的,这样避免不必要的在编译汇编代码时候的引用。
2. CHECKER
当编译内核代码的时候,使用make C=1或C=2的时候,会调用一个叫Sparse的工具,这个工具对内核代码进行检查,怎么检查呢,就是靠对那些声明过Sparse这个工具所能识别的特性的内核函数或是变量进行检查。在调用Sparse这个工具的同时,在Sparse代码里,会加上#define __CHECKER__ 1的字样。换句话说,就是,如果使用Sparse对代码进行检查,那么内核代码就会定义__CHECKER__宏,否则就不定义。
所以这里就能看出来,类似于__attribute__((noderef, address_space(1)))这样的属性就是Sparse这个工具所能识别的了。
接下来就正式进入__attribute__属性,
【文章福利】小编推荐自己的Linux内核技术交流群: 【977878001】整理一些个人觉得比较好得学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!前100进群领取,额外赠送一份 价值699的内核资料包(含视频教程、电子书、实战项目及代码)
内核资料直通车:Linux内核源码技术学习路线+视频教程代码资料
学习直通车: