一 平台相关代码
即arch/xxx目录下的代码能包含的头文件有:
1. arch/$(SRCARCH)/include/asm为平台相关头文件
2.include/asm-generic为所有平台共用的头文件,跟具体平台无关,提取平台相关的共同定义部分,如:
./arch/arm64/include/asm/irq.h:11:#include <asm-generic/irq.h>
3. include/linux 下的头文件
二 平台无关代码
即除了arch/xxx目录之外的代码可以包含的头文件有:
- 平台相关头文件,具体路径由顶层makefile定义:
LINUXINCLUDE := -I$(srctree)/arch/$(hdr-arch)/include \
-Iarch/$(hdr-arch)/include/generated -Iinclude \
$(if $(KBUILD_SRC), -I$(srctree)/include) \
-include
2. /include
/include directory is for generic header files to define interfaces between components of the kernel. In most situations, you will find all the kernel functionalities you need in these headers
3. include/asm-generic
原则上不建议直接包含include/asm-generic中的头文件,而是应该通过平台相关的头文件来间接包含,当然这只是原则上,也有直接包含的
PHONY += asm-generic
asm-generic:
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.asm-generic \
src=asm obj=arch/$(SRCARCH)/include/generated/asm
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.asm-generic \
src=uapi/asm obj=arch/$(SRCARCH)/include/generated/uapi/asm
实际上就是根据include/asm-generic目录下的头文件生成的。
//scripts/Makefile.asm-generic
# include/asm-generic contains a lot of files that are used
# verbatim by several architectures.
#
# This Makefile reads the file arch/$(SRCARCH)/include/asm/Kbuild
# and for each file listed in this file with generic-y creates
# a small wrapper file in $(obj) (arch/$(SRCARCH)/include/generated/asm)
kbuild-file := $(srctree)/arch/$(SRCARCH)/include/$(src)/Kbuild
-include $(kbuild-file)
include scripts/Kbuild.include
# Create output directory if not already present
_dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj))
# Stale wrappers when the corresponding files are removed from generic-y
# need removing.
generated-y := $(generic-y) $(genhdr-y) $(generated-y)
all-files := $(patsubst %, $(obj)/%, $(generated-y))
old-headers := $(wildcard $(obj)/*.h)
unwanted := $(filter-out $(all-files),$(old-headers))
quiet_cmd_wrap = WRAP $@
cmd_wrap = echo "\#include <asm-generic/$*.h>" >$@
quiet_cmd_remove = REMOVE $(unwanted)
cmd_remove = rm -f $(unwanted)
all: $(patsubst %, $(obj)/%, $(generic-y)) FORCE
$(if $(unwanted),$(call cmd,remove),)
@:
$(obj)/%.h:
$(call cmd,wrap)
PHONY += FORCE
.PHONY: $(PHONY)
FORCE: ;
拿arm64来说:
//arch/arm64/include/asm/Kbuild
generic-y += bugs.h
generic-y += clkdev.h
generic-y += cputime.h
generic-y += current.h
generic-y += delay.h
generic-y += div64.h
generic-y += dma.h
generic-y += dma-contiguous.h
generic-y += early_ioremap.h
generic-y += emergency-restart.h
generic-y += errno.h
generic-y += hw_irq.h
generic-y += ioctl.h
generic-y += ioctls.h
generic-y += ipcbuf.h
generic-y += irq_regs.h
generic-y += kdebug.h
generic-y += kmap_types.h
generic-y += kvm_para.h
generic-y += local.h
generic-y += local64.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
generic-y += mman.h
generic-y += msgbuf.h
generic-y += msi.h
generic-y += mutex.h
generic-y += poll.h
generic-y += preempt.h
generic-y += resource.h
generic-y += rwsem.h
generic-y += segment.h
generic-y += sembuf.h
generic-y += serial.h
generic-y += shmbuf.h
generic-y += simd.h
generic-y += sizes.h
generic-y += socket.h
generic-y += sockios.h
generic-y += swab.h
generic-y += switch_to.h
打开具体的例子看看:
//arch/arm64/include/generated/asm/bugs.h
#include <asm-generic/bugs.h>
结果一目了然
三 usr/include
为kernel导出的头文件,主要给应用空间使用,比如libc的编译需要用到这些都文件。