鸿蒙开源kernel学习记录(一)

前言

基于鸿蒙开源的code-1.0,学习

鸿蒙kernel代码初识

经常使用的是linux内核,直接看到鸿蒙的代码,没有找到详细的配置说明手册有点摸不清楚从哪入手。
编译环境搭建完成,尝试了编译成功后,决定按照自己的学习方法,先从kernel的编译配置入手,开始学习下鸿蒙的kernel。
在linux中kernel的配置一般使用了arch/arm/config中的配置文件进行配置。那么鸿蒙的kernel是从哪里找到的config呢?
进入鸿蒙的kernel/liteos_a,可以看到目录下有几个文件
Makefile
Kconfig
config.mk
build.sh
BUILD.gn

Makefile和Kconfig

首先先看下makefile和kconfig
因为这两个文件linux内核中经常修改,一看名字比较亲切
粗略看了下Kconfig,和linux的一样,主要是对config的宏进行处理。生成代码中的CONIFG_XX对应的宏。
Makefile主要是编译相关

help:
	$(HIDE)echo "-------------------------------------------------------"
	$(HIDE)echo "1.====make help:    get help infomation of make"
	$(HIDE)echo "2.====make:         make a debug version based the .config"
	$(HIDE)echo "3.====make debug:   make a debug version based the .config"
	$(HIDE)echo "4.====make release: make a release version for all platform"
	$(HIDE)echo "5.====make release PLATFORM=xxx:  make a release version only for platform xxx"
	$(HIDE)echo "6.====make rootfsdir: make a original rootfs dir"
	$(HIDE)echo "7.====make rootfs FSTYPE=***: make a original rootfs img"
	$(HIDE)echo "8.====make test: make the testsuits_app and put it into the rootfs dir"
	$(HIDE)echo "9.====make test_apps FSTYPE=***: make a rootfs img with the testsuits_app in it"
	$(HIDE)echo "xxx should be one of (hi3516cv300 hi3516ev200 hi3556av100/cortex-a53_aarch32 hi3559av100/cortex-a53_aarch64)"
	$(HIDE)echo "*** should be one of (jffs2)"
	$(HIDE)echo "-------------------------------------------------------"

debug:
	$(HIDE)echo "=============== make a debug version  ==============="
	$(HIDE) $(MAKE) all

BUILD.gn

.gn文件,以前从来没有接触过,还好文件内容比较简单,对着内容加百度大概学习了一下

import("//build/lite/config/subsystem/lite_subsystem.gni")
**#导入了gni相关模板,文件是lite_subsystem.gni
#在这个文件中主要定义lite_subsystem模板,**
# Defines a subsystem
#
# The lite_subsystem template defines all the modules contained in a subsystem
#
# Parameters
#
#   subsystem_components (required)
#     [list of scopes] Defines all modules in the subsystem.
#
#
**例如:
template("lite_subsystem") {
#申明lite_subsystem模板,模板定义了一个类似于函数的自定义名称*
    assert(defined(invoker.subsystem_components), "subsystem_components in required.")
#gn系统函数assert,判断是否定义魔术变量subsystem_components
#defined:返回是否定义了标识符。
#如果定义了给定参数,则返回true。
#assert如果条件为false,则生成将失败并出现错误。
#如果提供了可选的第二个参数,将打印该字符串
#显示错误消息。**

    lite_subsystem_components = invoker.subsystem_components
**#将加载的subsystem_components变量赋值给lite_subsystem_components
#subsystem_components变量可以在项目配置中找到定义**

    group(target_name) {
**#创建一个当前目标名称的节点,target_name是当前目标的名称,在这里是使用模板创建的的名称
#例如lite_subsystem("kernel"),则target_name就是kernel
#group就是创建一个节点,这个节点是引用一个或多个其他目标的虚拟依赖关系**
        deps = []
**#定义一个空的私有链接依赖**
        if(defined(invoker.deps)) {
            deps += invoker.deps
**#如果已经有deps依赖,就将依赖加入引用
#deps就是保存需要引入的代码的路径,有点类似于include**
        }
        **# add subsystem packages**
        foreach(pkg_label, lite_subsystem_components) {
**#foreach就是循环整个 lite_subsystem_components列表,pkg_label代表列表的第几个成员
#pkg_label会从指向第一个成员开始
#mylist = [ "a", "b", "c" ]
# foreach(i, mylist) {
#   print(i)
#  }
#
#  Prints:
#  a
#  b
#  c**
            deps += [ pkg_label ]
**#将 lite_subsystem_components每个成员加入依赖**
        }
    }
}




declare_args() {
    enable_ohos_kernel_liteos_a_ext_build = true
    LOSCFG_TEST_APPS = false
}
**#将给定参数引入当前范围。
#如果未在命令行或工具链的参数中指定它们,则将使用declare_args块中给定的默认值。但是,这些默认值不会
#覆盖命令行值。**

lite_subsystem("kernel") {
**#创建一个kernel名的lite_subsystem,类似于创建一个lite_subsystem的函数,函数名是kernel
#这个模板的参数就是kernel{}中所写的,类似于函数传递的参数**
    subsystem_components = []

    if (enable_ohos_kernel_liteos_a_ext_build == false) {
        subsystem_components += [
            "//kernel/liteos_a/kernel",
            "//kernel/liteos_a/net",
            "//kernel/liteos_a/lib",
            "//kernel/liteos_a/compat",
            "//kernel/liteos_a/fs",
            "//kernel/liteos_a/arch:platform_cpu",
        ]
        if (LOSCFG_SHELL) {
            subsystem_components += [ "//kernel/liteos_a/shell" ]
        }
    } else {
        deps = [":make"]
    }
}

action("make") {
**#执行make**
    script = "//build/lite/build_ext_components.py"
**#脚本路径**
    outputs = [ "$target_gen_dir/liteos_a_build_log.txt" ]
**#输出文件**
    exec_path = rebase_path(rebase_path(".", root_build_dir))
    outdir = rebase_path(get_path_info(".", "out_dir"))
    command = "make clean OUTDIR=$outdir && make rootfs VERSION=\"${ohos_version}\" -j 16 OUTDIR=$outdir"
    args = [
        "--path=$exec_path",
        "--prebuilts=sh build.sh ${board_name} ${ohos_build_compiler} ${ohos_build_type}",
**#调用了一个build.sh脚本**
        "--command=${command}"
    ]
}

build.sh

现在来看看这个build.sh

set -e

echo "sh param:$1,$2,$3"
#获取运行build.sh时后面跟着的三个参数
#$1 ${board_name}
#$2 ${ohos_build_compiler}
#$3 ${ohos_build_type}

source="tools/build/config/$1_release.config"
#加载config文件
destination=".config"
if [ "$2" = "clang" ]; then
    if [ "$3" = "debug" ]; then
        source="tools/build/config/debug/$1_$2.config"
    else
        source="tools/build/config/$1_$2_release.config"
    fi
elif [ "$2" = "gcc" ]; then
    if [ "$3" = "debug" ]; then
        source="tools/build/config/$1_debug_shell.config"
    else
        source="tools/build/config/$1_release.config"
    fi
fi
if [ -d "./out" ]; then
    rm -rf ./out
fi
if [ -f "$destination" ]; then
    rm -rf $destination
fi
cp $source $destination
#把对应项目的config 拷贝到kernel/.config

所以kernel的config文件在对应的tools/build/config/文件目录下。
进入目录tools/build/config/下,看到很多项目对应的config文件

config.mk

打开文件,看到很多配置,不太清楚是做什么的

############### this is a makefile that you can config it ###############
-include $(LITEOSTOPDIR)/tools/build/mk/los_config.mk

TOP_LD_PATH      = $(LITEOSTOPDIR)
SCRIPTS_PATH     = $(LITEOS_SCRIPTPATH)
LITEOS_MK_PATH   = $(MK_PATH)
LITEOS_SUBDIRS   = $(LIB_SUBDIRS)
LIB_BIGODIR      = $(LITEOS_LIB_BIGODIR)

##### liteos tables -u ldflags #####
-include $(LITEOS_MK_PATH)/liteos_tables_ldflags.mk


LITEOS_COPTS   := $(LITEOS_COPTS_DEBUG) $(LITEOS_COPTS_BASE)  \
                  $(LITEOS_COPTS_EXTRA) $(LITEOS_CORE_COPTS)
LITEOS_CXXOPTS  := $(LITEOS_CXXOPTS_BASE)
LITEOS_INCLUDE  := $(LITEOS_KERNEL_INCLUDE)  $(LITEOS_EXTKERNEL_INCLUDE) \
                   $(LITEOS_COMPAT_INCLUDE)  $(LITEOS_FS_INCLUDE) \
                   $(LITEOS_NET_INCLUDE)     $(LITEOS_LIB_INCLUDE) \
                   $(LITEOS_DRIVERS_INCLUDE) $(LOSCFG_TOOLS_DEBUG_INCLUDE) \
                   $(LITEOS_PLATFORM_INCLUDE) $(LITEOS_DFX_INCLUDE) \
                   $(LITEOS_SECURITY_INCLUDE)
LITEOS_LIBDEP   := $(LITEOS_BASELIB)
LITEOS_ASFLAGS  := $(LITEOS_ASOPTS)      $(LITEOS_INCLUDE)
LITEOS_CFLAGS   := $(LITEOS_COPTS)       $(LITEOS_CMACRO) \
                   $(LITEOS_CMACRO_TEST) $(LITEOS_IMAGE_MACRO) \
                   $(LITEOS_INCLUDE)
LITEOS_CXXFLAGS := $(LITEOS_CXXOPTS)     $(LITEOS_CXXMACRO) \
                   $(LITEOS_CMACRO)      $(LITEOS_CXXINCLUDE)
LITEOS_LDFLAGS  := $(LITEOS_LD_OPTS)     $(LITEOS_LD_PATH) \
                   $(LITEOS_LD_SCRIPT)

根据配置路径,找到kernel/tools/build/mk/los_config.mk
打开los_config.mk文件看,发现里面是根据config的配置,将需要的代码或者path或者路径加入配置的标志中。

你可能感兴趣的:(鸿蒙系统)