美文网首页Android开发经验谈Android技术知识
鸿蒙来啦!快速入门OpenHarmony的LiteOS微内核,你

鸿蒙来啦!快速入门OpenHarmony的LiteOS微内核,你

作者: 5893d0835188 | 来源:发表于2020-09-19 13:57 被阅读0次

    想要成为一名优秀的Android开发,你需要一份完备的 知识体系,在这里,让我们一起成长为自己所想的那样~。

    文章目录

    1、获取源码

    OpenHarmonyHarmonyOS的开源版,由华为捐赠给开放原子开源基金会(OpenAtom Foundation)开源。第一个开源版本支持在128KB~128MB设备上运行,欢迎参加开源社区一起持续演进。

    代码仓库地址1:https://codechina.csdn.net/openharmony

    在这里插入图片描述

    代码仓库地址2:https://openharmony.gitee.com

    在这里插入图片描述

    本专栏主要分析OpenHarmony内核的相关代码:
    Cortex-A系列处理器内核:kernel_liteos_a
    Cortex-M系列处理器内核:kernel_liteos_m

    2、什么是LiteOS

    Huawei LiteOS是华为针对物联网领域推出的轻量级物联网操作系统,是华为物联网战略的重要组成部分,具备轻量级、低功耗、互联互通、组件丰富、快速开发等关键能力,基于物联网领域业务特征打造领域性技术栈,为开发者提供 “一站式” 完整软件平台,有效降低开发门槛、缩短开发周期,可广泛应用于可穿戴设备、智能家居、车联网、LPWA等领域。

    Huawei LiteOS微内核在OpenHarmony源码中所处的位置:

    在这里插入图片描述

    3、LiteOS的目录介绍

    我们以Cortex-A系列处理器内核为例:kernel_liteos_a

    可以看到有12目录、4个文件。

    • 目录的作用
    名称 描述
    apps 用户态的init和shell应用程序。
    arch 体系架构的目录,如arm等。
    bsd freebsd相关的驱动和适配层模块代码引入,例如USB等。
    compat 内核posix接口的兼容。
    fs 文件系统模块,主要来源于NuttX开源项目。
    kernel 进程、内存、IPC等模块。
    lib 内核的lib库。
    net 网络模块,主要来源于lwip开源项目。
    platform 支持不同的芯片平台代码,如Hi3516DV300等。
    security 安全特性相关的代码,包括进程权限管理和虚拟id映射管理。
    syscall 系统调用。
    tools 构建工具及相关配置和代码。
    • 文件的作用
    名称 描述
    Makefile 存储了源码文件构建目标文件的规则,具体是否按着规则去执行还要看配置变量。
    Kconfig 配置变量
    config.mk 主要进行编译选项的设置、编译工具的定义、编译时包含的文件、编译的链接地址。
    build.sh 编译脚本

    4、LiteOS 中Make体系

    顶层 Makefile 在编译时是入口点,从整体上组织所有的 Makefile 文件,并定义终极目标,在这里还定义了与平台无关的很多核心变量与一些很重要的 make目标。顶层 Makefile 位于内核源码的根目录,下面我们分析顶层 Makefile 的主要工作。

    用户在内核目录中键入make menuconfig之后 ,工作流程如下 :

    1. 顶 层 Makefile调用解析顶层Kconfig文件,获得待配置条目;
    2. 判断是否有已配置好的.config文件,如果有则导入;
    3. 用户在配置好后,将配置结果存入配置文件。

    Linux类似LiteOSMake体系顶层 makefile会通过读取配置文件,递归编译内核代码树的相关目录。
    /kernel_liteos_a/Makefile

    ##### make menuconfig #####
    export CONFIG_=LOSCFG_
    MENUCONFIG_PATH = $(LITEOSTOPDIR)/tools/menuconfig
    KCONFIG_FILE_PATH = $(LITEOSTOPDIR)/Kconfig
    
    

    5、LiteOS 中Kconfig的配置

    无论在什么平台上,软件配置是用户接触程序的第一步,我们这里是内核配置,那么入口就是Kconfig文件。

    5.1、顶层Kconfig

    通过顶层的Kconfig我们可以看见内核所以支持的功能,类似说明书一样,等待你去打开功能。
    例如:

    kernel_liteos_a/Kconfig

    //包含其他的Kconfig
    source "../../vendor/hisi/hi35xx/platform/hiedmac/Kconfig"
    source "../../kernel/liteos_a/bsd/dev/usb/Kconfig"
    source "../../drivers/hdf/lite/Kconfig"
    
    config USB_DEBUG
        bool "Enable USB Debug"
        default n
        depends on SHELL && DRIVERS_USB && DEBUG_VERSION
        help
          Answer Y to enable LiteOS support usb debug.
          use shell command to open the specified debug level print.
    
    config MEM_DEBUG
        bool "Enable MEM Debug"
        default n
        depends on DEBUG_VERSION
        help
          Answer Y to enable LiteOS support mem debug.
    
    

    通过source加载其他的Kconfig例如加载USB相关配置

    kernel_liteos_a/bsd/dev/usb/Kconfig:

    config DRIVERS_USB
        bool "Enable USB"
        default y
        depends on DRIVERS && COMPAT_BSD
        help
          Answer Y to enable LiteOS support usb.
    
    config DRIVERS_USB_HOST_DRIVER
        bool "Enable USB HCD"
        default y
        depends on DRIVERS_USB && DRIVERS
        help
          Answer Y to enable LiteOS to support usb host controller driver.
    ...
    
    

    5.2、具体板级的deconfig文件

    可配置说明书有了,我们也不能每次都重新配置一遍把,这个时候就有板级默认配置。

    目前LiteOS中Cortex-A系列处理器内核为例:kernel_liteos_a适配的开发板:hi3518hi3516,并提供了已经配置好的.config,下来我们以hi3518为例子对其进行分析。
    源文件为:tools/build/config/hi3516dv300_release.config
    [图片上传失败...(image-5e5f6e-1600494723897)]

    通过该文件我们可以知道内核配置包括了些什么?
    CPU、开发板、文件系统、驱动程序和调试等大量的待配置信息。

    # Automatically generated file; DO NOT EDIT.
    # Huawei LiteOS Configuration
    
    # Compiler
    ...
    # Platform
    ...
    # Extra Configurations
    ...
    # Kernel
    ...
    # Lib
    ...
    # Compat
    ...
    # FileSystem
    ...
    # Net
    ...
    # Debug
    ...
    # Driver
    LOSCFG_DRIVERS=y
    LOSCFG_DRIVERS_USB=y
    LOSCFG_DRIVERS_USB_HOST_DRIVER=y
    # LOSCFG_DRIVERS_USB_HOST_EHCI is not set
    LOSCFG_DRIVERS_USB_HOST_XHCI=y
    LOSCFG_DRIVERS_USB_DEVICE_CLASS_DRIVERS=y
    
    

    后面我们就将以LOSCFG_DRIVERS_USB为切入点分析源码,但在这之前,我们配置有了,下来就是编译了。

    6、编译

    kernel_liteos_a/bsd/dev/usb/Makefile
    最后编译时候,会根据.config编译相关的源代码:

    例如下面这些代码都将会进行编译,生成了目标文件usb_bask

    include $(LITEOSTOPDIR)/config.mk
    
    MODULE_NAME := usb_base
    
    ifeq ($(LOSCFG_DRIVERS_USB), y)
    LOCAL_SRCS += $(CORE_SRC)/usb_dynamic.c  \
                  $(CORE_SRC)/usb_parse.c  \
                  $(CORE_SRC)/usb_error.c  \
                  $(CORE_SRC)/usb_handle_request.c  \
                  $(CORE_SRC)/usb_util.c  \
                  $(CORE_SRC)/usb_lookup.c  \
                  $(CONTROLLER_HOST_SRC)/usb_controller.c  \
                  $(QUIRK_SRC)/usb_quirk.c \
                  $(CORE_SRC)/usb_device.c  \
                  $(CORE_SRC)/usb_process.c  \
                  $(CORE_SRC)/usb_hub.c  \
                  $(CORE_SRC)/usb_request.c  \
                  $(CORE_SRC)/usb_transfer.c  \
                  $(CORE_SRC)/usb_dev.c  \
                  $(CORE_SRC)/usb_mbuf.c  \
                  $(CORE_SRC)/usb_generic.c \
                  $(CORE_SRC)/usb_if.c
    endif
    
    

    这里生成目标文件是如何链接的内核中,这个时候我们就要开始分析config.mk的作用了:

    7、顶层目录下的config.mk文件主要完成如下功能的配置:

    1、确定生成可执行文件过程中需要的各种工具,如编译器(arm-linux-gcc)、连接器(arm-linux-ld)、反汇编器(arm-linux-objdump
    2、确定CPU、板相关的配置文件,存在于各个目录下的config.mk
    3、确定编译、链接、转换等过程的操作选项
    4、根据步骤3确定的编译连接选项生成需要的文件
    kernel_liteos_a/Makefile:

    $(LD) $(LITEOS_LDFLAGS) $(LITEOS_TABLES_LDFLAGS) $(LITEOS_DYNLDFLAGS) -Map=$(OUT)/$@.map -o $(OUT)/$@ --start-group $(LITEOS_LIBDEP) --end-group
    
    

    kernel_liteos_a\config.mk:

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

    目录:kernel_liteos_a\tools\build\mk\los_config.mk

    ############################# Platform Option Begin#################################
    include $(LITEOSTOPDIR)/platform/bsp.mk
    ...
    ifeq ($(LOSCFG_DRIVERS_USB), y)
        LITEOS_BASELIB  += -lusb_base
        LIB_SUBDIRS     += $(LITEOSTOPDIR)/bsd/dev/usb
        LITEOS_USB_INCLUDE += -I $(LITEOSTOPDIR)/bsd/dev/usb
    ifeq ($(LOSCFG_USB_DEBUG), y)
        LITEOS_CMACRO   += -DLOSCFG_USB_DEBUG
    endif
    endif
    ...
    
    

    看到这里,我相信大家对kernel_liteos_a整个代码框架有了整体的印象,后面我们就会深入到具体的驱动模块及子系统中看看,它是如何实现的。

    本文在开源项目:https://github.com/Android-Alvin/Android-LearningNotes 中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中...

    相关文章

      网友评论

        本文标题:鸿蒙来啦!快速入门OpenHarmony的LiteOS微内核,你

        本文链接:https://www.haomeiwen.com/subject/jmmeyktx.html