OpenHarmony之内核层

目录

OpenHarmony简介

技术架构

OpenHarmony整体遵从分层设计,从下向上依次为:内核层、系统服务层、框架层和应用层。系统功能按照“系统 > 子系统 > 组件”逐级展开,在多设备部署场景下,支持根据实际需求裁剪某些非必要的组件。OpenHarmony技术架构如下所示:

oh

技术特性

硬件互助,资源共享

主要通过下列模块达成

  • 分布式软总线

    分布式软总线是多设备终端的统一基座,为设备间的无缝互联提供了统一的分布式通信能力,能够快速发现并连接设备,高效地传输任务和数据。

  • 分布式数据管理

    分布式数据管理位于基于分布式软总线之上的能力,实现了应用程序数据和用户数据的分布式管理。

  • 分布式任务调度

    分布式任务调度基于分布式软总线、分布式数据管理、分布式Profile等技术特性,构建统一的分布式服务管理(发现、同步、注册、调用)机制,支持对跨设备的应用进行远程启动、远程调用、绑定/解绑、以及迁移等操作,能够根据不同设备的能力、位置、业务运行状态、资源使用情况并结合用户的习惯和意图,选择最合适的设备运行分布式任务

  • 设备虚拟化

    分布式设备虚拟化平台可以实现不同设备的资源融合、设备管理、数据处理,将周边设备作为手机能力的延伸,共同形成一个超级虚拟终端。

一次开发,多端部署

OpenHarmony提供用户程序框架、Ability框架以及UI框架,多终端软件平台API具备一致性,确保用户程序的运行兼容性。一次开发、多端部署。

统一OS,弹性部署

OpenHarmony通过组件化和组件弹性化等设计方法,做到硬件资源的可大可小,在多种终端设备间,按需弹性部署,全面覆盖了ARM、RISC-V、x86等各种CPU,从百KiB到GiB级别的RAM。

系统类型

OpenHarmony支持如下几种系统类型:

类型 处理器 最小内存 能力
轻量系统(mini system) MCU类处理器(例如Arm Cortex-M、RISC-V 32位的设备) 128KiB 提供多种轻量级网络协议,轻量级的图形框架,以及丰富的IOT总线读写部件等。
小型系统(small system) 应用处理器(例如Arm Cortex-A的设备) 1MiB 提供更高的安全能力、标准的图形框架、视频编解码的多媒体能力。
标准系统(standard system) 应用处理器(例如Arm Cortex-A的设备) 128MiB 提供增强的交互能力、3D GPU以及硬件合成能力、更多控件以及动效更丰富的图形能力、完整的应用框架。

内核层

  • 内核子系统: 采用多内核(Linux内核或者LiteOS)设计,支持针对不同资源受限设备选用适合的OS内核。内核抽象层(KAL,Kernel Abstract Layer)通过屏蔽多内核差异,对上层提供基础的内核能力,包括进程/线程管理、内存管理、文件系统、网络管理和外设管理等。

  • 驱动子系统: 驱动框架(HDF)是系统硬件生态开放的基础,提供统一外设访问能力和驱动开发、管理框架。 OpenHarmony驱动子系统采用C面向对象编程模型构建,通过平台解耦、内核解耦,兼容不同内核,提供了归一化的驱动平台底座。

内核子系统

OpenHarmony针对不同量级的系统,分别使用了不同形态的内核,分别为LiteOS和Linux。

系统级别 轻量系统 小型系统 标准系统
LiteOS ×
Linux ×

LiteOS

OpenHarmony LiteOS内核是面向IoT领域的实时操作系统内核,基于Huawei LiteOS内核演进发展而来,包含LiteOS-M和LiteOS-A两类内核。

  • LiteOS-M内核面向的MCU一般是百K级内存,可支持MPU(Memory Protection Unit)隔离,类似FreeRTOS或ThreadX等;
  • LiteOS-A内核面向设备一般是M级内存,可支持MMU(Memory Management Unit)隔离,类似Zircon或Darwin等。

LiteOS-M

LiteOS-M内核架构包含硬件相关层和硬件无关层。
硬件相关层按不同编译工具链、芯片架构分类,提供统一的HAL接口;
硬件无关层,其中基础内核模块提供基础能力,扩展模块提供网络、文件系统等组件能力,还提供错误处理、调测等能力,KAL模块提供统一的标准接口。
LiteOS-M

注:ARM Cortex™ 微控制器软件接口标准(CMSIS:Cortex Microcontroller Software Interface Standard) 是 Cortex-M 处理器系列的与供应商无关的硬件抽象层

LiteOS-A

LiteOS-A内核重要的新特性如下:

  • 新增了丰富的内核机制, 新增虚拟内存、系统调用、多核、轻量级IPC、DAC(Discretionary Access Control,自主访问控制)等机制,丰富了内核能力;新增支持多进程,使得应用之间内存隔离、相互不影响

  • 支持1200+标准POSIX接口 更加全面的支持POSIX标准接口,使得应用软件易于开发和移植

LiteOS-A内核架构图:
LiteOS-A

Linux

OpenHarmony 中Linux内核从LTS版本中选择合适的版本作为内核的基础版本,目前已完成对Linux-4.19及Linux-5.10的适配及支持,4.19已经处于维护周期

OH-Linux

下面是 Linux 内核适配层的目录结构:

drivers/hdf_core/adapter/khdf/linux
├── manager               #linux内核下启动适配启动HDF框架代码
├── model                 #驱动模型适配linux代码
│   ├── audio
│   ├── camera
│   ├── display
│   ├── input
│   ├── misc              #杂项驱动模型,包括dsoftbus、light、vibrator等
│   ├── network           #网络驱动模型,包括wifi、bt等
│   ├── sensor
│   ├── storage
│   └── usb
├── network               #适配linux内核网络代码
├── osal                  #适配linux内核的posix接口
├── platform              #平台设备接口适配linux内核代码
│   ├── adc
│   ├── emmc
│   ├── fwk
│   ├── gpio
│   ├── i2c
│   ├── mipi_csi
│   ├── mipi_dsi
│   ├── mmc
│   ├── pwm
│   ├── regulator
│   ├── rtc
│   ├── sdio
│   ├── spi
│   ├── uart
│   └── watchdog        
├── test                  #linux内核测试用例
└── utils                 #linux内核下编译配置解析代码的编译脚本

内核增强特性

OpenHarmony 针对 linux 内核做了以下增强:

  • Enhanced SWAP 特性
  • 关联线程组调度
  • CPU 轻量级隔离
  • New IP内核协议栈
  • XPM(eXecutable Permission Manager)模块

这些 Linux 内核增强特性,是否对我们现在的内核优化有啥借鉴意义?

Patch合入流程

主要是按照kernel.mk中对应的patch路径规则及命名规则,合入相应补丁

  1. 合入不同内核版本对应的HDF内核补丁:

    $(OHOS_BUILD_HOME)/drivers/hdf_core/adapter/khdf/linux/patch_hdf.sh $(OHOS_BUILD_HOME) $(KERNEL_SRC_TMP_PATH) $(KERNEL_PATCH_PATH) $(DEVICE_NAME)
  2. 合入芯片平台驱动补丁,以Hi3516DV300为例:

    DEVICE_PATCH_DIR := $(OHOS_BUILD_HOME)/kernel/linux/patches/${KERNEL_VERSION}/$(DEVICE_NAME)_patch
    DEVICE_PATCH_FILE := $(DEVICE_PATCH_DIR)/$(DEVICE_NAME).patch
  3. 修改自己所需要编译的config:

    KERNEL_CONFIG_PATH := $(OHOS_BUILD_HOME)/kernel/linux/config/${KERNEL_VERSION}
    DEFCONFIG_FILE := $(DEVICE_NAME)_$(BUILD_TYPE)_defconfig

    HCK

HCK(OpenHarmony Common Kernel)内核解耦框架。该框架为最新的v4.0 Beta版本引入,为开发者提供了整套插桩、注册、调用接口,减少对内核的侵入修改,统一解耦框架,插桩接口可在多平台间通用,使三方内核特性在不侵入或少侵入内核仓的情况下合入社区

HCK定义、注册、调用接口及流程图:
hck.png

目前还只有 xpmnewip模块使用

直接合入内核仓或适用patch方法,相比有哪些弊端?维护,移植

KAL

内核抽象层(KAL,Kernel Abstract Layer)通过屏蔽多内核差异,对上层提供基础的内核能力,包括进程/线程管理、内存管理、文件系统、网络管理和外设管理等

Linux内核中操作系统抽象层(OSAL,Operating System Abstraction Layer)部分:

drivers/hdf_core/adapter/khdf/linux/osal/
├── include
│   ├── hdf_log_adapter.h
│   ├── hdf_types.h
│   ├── osal_atomic_def.h
│   ├── osal_cdev_adapter.h
│   ├── osal_io_adapter.h
│   ├── osal_math.h
│   └── osal_uaccess.h
├── Makefile
└── src
    ├── Makefile
    ├── osal_cdev.c
    ├── osal_deal_log_format.c
    ├── osal_file.c
    ├── osal_firmware.c
    ├── osal_irq.c
    ├── osal_mem.c
    ├── osal_mutex.c
    ├── osal_sem.c
    ├── osal_spinlock.c
    ├── osal_thread.c
    ├── osal_time.c
    ├── osal_timer.c
    └── osal_workqueue.c

驱动子系统

OpenHarmony驱动子系统采用C面向对象编程模型构建,通过平台解耦、内核解耦,兼容不同内核,提供了归一化的驱动平台底座,旨在为开发者提供更精准、更高效的开发环境,力求做到一次开发,多系统部署。

驱动架构

HDF(Hardware Driver Foundation)驱动框架,为驱动开发者提供驱动框架能力,包括驱动加载、驱动服务管理和驱动消息机制。
HDF驱动框架架构如下图所示:

hdf.png

HDF驱动架构主要组成部分:

  • HDI层: (Hardware Device Interface,硬件设备统一接口),通过规范化的设备接口标准,为系统提供统一、稳定的硬件设备操作接口。

  • HDF驱动框架: 提供统一的硬件资源管理、驱动加载管理、设备节点管理、设备电源管理以及驱动服务模型等功能,需要包含设备管理、服务管理、DeviceHost、PnPManager等模块。

  • 统一的配置界面: 支持硬件资源的抽象描述,屏蔽硬件差异,可以支撑开发者开发出与配置信息不绑定的通用驱动代码,提升开发及迁移效率,并可通过HC-Gen等工具快捷生成配置文件。

  • 操作系统抽象层: 提供统一封装的内核操作相关接口,屏蔽不同系统操作差异,包含内存、锁、线程、信号量等接口。

  • 平台驱动: 为外设驱动提供硬件(如:I2C/SPI/UART总线等平台资源)操作统一接口,同时对硬件操作进行统一的适配接口抽象以便于不同平台迁移。

  • 外设驱动模型: 面向外设驱动,提供常见的驱动抽象模型。

驱动开发

平台驱动

这里的平台设备,泛指I2C/UART等总线、以及GPIO/RTC等特定硬件资源。

平台驱动框架提供如下特性:

  • 统一的平台设备访问接口(向上):对平台设备操作接口进行统一封装,屏蔽不同SoC平台硬件差异以及不同OS形态差异,为系统及外设驱动提供标准的平台设备访问接口
  • 统一的平台驱动适配接口(向下):为平台设备驱动提供统一的适配接口,使其只关注自身硬件的控制,而不必关注设备管理及公共业务流程。
  • 提供设备注册、管理、访问控制等与SoC无关的公共能力。

目前支持的设备类型包括但不限于:ADC、DAC、GPIO、HDMI、I2C、I3C、MIPI_CSI、MIPI_DSI、MMC、Pin、PWM、Regulator、RTC、SDIO、SPI、UART、WatchDog等。

外设驱动

在HDF驱动框架及平台驱动框架的基础上,提供标准化的外设器件驱动,可以减少重复开发;提供统一的外设驱动抽象模型,屏蔽驱动与不同系统组件间的交互,使得驱动更具备通用性。

目前支持的外设设备类型包括但不限于:Audio、Camera、Codec、Face_auth、Fingerprint_auth、LCD、Light、Motion、Pin_auth、Sensor、Touchscreen、USB、User_auth、Vibrator、WLAN等。

驱动架构代码说明

仓库路径 仓库内容
drivers/hdf_core/framework HDF框架、平台驱动框架、驱动模型等平台无关化的公共框架
drivers/hdf_core/adapter/khdf 提供驱动框架对LiteOS-M、LiteOS-A内核、Linux等所有内核依赖适配
drivers/hdf_core/adapter/uhdf 提供用户态驱动接口对系统依赖适配
drivers/hdf_core/adapter/uhdf2 提供用户态驱动框架对系统依赖适配
drivers/peripheral Display、Input、Sensor、WLAN、Audio、Camera等外设模块硬件抽象层。
drivers/interface Display、Input、Sensor、WLAN、Audio、Camera等外设模块HDI接口定义。
drivers/external_device_manager 扩展外部设备管理框架

思考

  • 为啥大费力气单独弄一套HDF驱动框架?为了上层的大一统?不同内核,不同硬件平台之间的迁移? 统一,多端
  • KAL+HDF,微内核的雏形?为后面引入微内核做准备?
  • 有什么好处优势?KAL+独立的HDF驱动框架,分层解耦,驱动模型抽象,最小化修改最底层硬件适配,增加开发适配通用性,提高开发适配效率
  • HCK,减少对社区内核侵入性,我们是否可以借鉴?
  • 桌面系统内核一定非得是Linux内核?与内核解耦

参考

OpenHarmony官方文档
OpenHarmony官方仓库