以 x86
为例,arch/x86/include/asm/Kbuild
文件的内容如下所示:
$ cat arch/x86/include/asm/Kbuild
generated-y += syscalls_32.h
generated-y += syscalls_64.h
generated-y += unistd_32_ia32.h
generated-y += unistd_64_x32.h
generated-y += xen-hypercalls.h
generic-y += dma-contiguous.h
generic-y += early_ioremap.h
generic-y += export.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
在编译内核时会自动生成上述文件中所指定的头文件,假设内核编译时的输出目录为 out-x86/x86
,即 make O=out-x86/x86
,则这些自动生成的头文件在 out-x86/x86/arch/x86/include/generated/asm/
目录下,如下所示:
$ ls -1 out-x86/x86/arch/x86/include/generated/asm/
dma-contiguous.h
early_ioremap.h
export.h
mcs_spinlock.h
mm-arch-hooks.h
syscalls_32.h
syscalls_64.h
unistd_32_ia32.h
unistd_64_x32.h
xen-hypercalls.h
其中,部分头文件的内容比较简单,基本都是包含了 <asm-generic/xxx.h>
,也即:内核源码根目录下的 include/asm-generic/xxx.h
文件.
例如,dma-contiguous.h
头文件的内容:
$ cat out-x86/x86/arch/x86/include/generated/asm/dma-contiguous.h
#include <asm-generic/dma-contiguous.h>
这样做的目的是:在内核编程中,原则上不建议直接包含 include/asm-generic
中的头文件,而是应该通过平台相关的头文件来间接包含.
参考资料