开始着手学习arm linux知识了,为了自己的学习和实践代码和内核源生代码实现分离和解耦,决定在内核的根目录新增一个自己的源码目录,配置并编译进内核。
一.新增配置选项及编译脚本
(1) 新增根目录的配置选项
修改文件:
arch\arm\Kconfig
在“menu "System Type"”之前新增项目
# study/Kconfig
menu "Linux Kernel Study & Practice"
source "study/start/Kconfig"
endmenu
增加这几行可在 config界面新增一个叫Linux Kernel Study & Practice的项目
(2) 新增start目录的配置选项及编译文件
l 创建文件Kconfig:
study/start/Kconfig
内容如下:
# study/start/Kconfig
menuconfig STUDY_START
bool "kernel study start project"
help
kernel start study project
if STUDY_START
source "study/start/hello/Kconfig"
endif # STUDY_START
这个会在新增的config项目下新增一个二级菜单,下面的
source "study/start/hello/Kconfig"依赖于STUDY_START,是我的最终学习源码文件目录。
l 创建文件makefile
study/start/makefile
内容如下
# makefile add for study
obj-$(CONFIG_STUDY_START) += start/
这里的宏CONFIG_STUDY_START由上面的STUDY_START配置选项生成,表明子目录”start/”下面的makefile受这个宏依赖。
(3) 新start目录的配置选项及编译文件
第一个学习项目目录名为hello
l 创建文件\study\start\hello\Kconfig
内容如下:
config HELLO
tristate "First Android Driver"
default n
help
This is the first android driver.
l 创建文件\study\start\hello\makefile
内容如下:
obj-$(CONFIG_HELLO) += hello.o
可见linux的源码目录编译环境配置是Kconfig文件和makefile文件结合实现的,Kconfig生成宏和目录依赖关系,makefile把这些宏和依赖关系传递到具体的文件,这些是随着目录树由根目录往深处层层推进的。
二.把新增的目录加入编译最终的链接
因为是新增的一个根目录,所以这个时候还不会被编译器识别,还需要修改一个文件:
根目录下的makefile
增加如下(黑体):
# Objects we will link into vmlinux / subdirs we need to visit
drivers-y := drivers/ sound/ firmware/
study-y := study/
vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \
$(core-y) $(core-m) $(drivers-y) $(drivers-m) \
$(study-y) $(study-m)\
$(net-y) $(net-m) $(libs-y) $(libs-m)))
drivers-y := $(patsubst %/, %/built-in.o, $(drivers-y))
study-y := $(patsubst %/, %/built-in.o, $(study-y))
net-y := $(patsubst %/, %/built-in.o, $(net-y))
vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)$(study-y)
照抄drivers目录的配置,呵呵,这样我的新增工程就入驻kenel的根目录了