linux kernel头文件包含问题

一 平台相关代码

     即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目录之外的代码可以包含的头文件有:

  1. 平台相关头文件,具体路径由顶层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的编译需要用到这些都文件。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值