OpenHarmony ——内核子系统
内核子系统
简介
OpenHarmony针对不同量级的系统,分别使用了不同形态的内核,分别为LiteOS和Linux。在轻量系统、小型系统和标准系统上,可以选用LiteOS;在标准系统上,可以选用Linux。
表 1
LiteOS
OpenHarmonyLiteOS内核是面向IoT领域的实时操作系统内核,它同时具备RTOS轻快和Linux易用的特点。
OpenHarmonyLiteOS内核主要包括进程和线程调度、内存管理、IPC机制、timer管理等内核基本功能。
OpenHarmonyLiteOS内核的源代码分为 kernel_liteos_a 和 kernel_liteos_m 这2个代码仓库,其中kernel_liteos_a主要针对小型系统(small system)和标准系统(standard system),而kernel_liteos_m则主要针对轻量系统(mini system),下面主要针对kernel_liteos_a代码仓库进行介绍。图1为OpenHarmony LiteOS-A内核架构图:
图 1 OpenHarmony LiteOS-A内核架构图
Linux
OpenHarmony的Linux内核基于开源Linux内核LTS 4.19.y分支演进,为满足不同的内核场景诉求,以内核 + patch的形式开展,其中内核在LTS 4.19内核的基础上合入CVE补丁 + OpenHarmony特性作为Common内核基线,针对性打上vendor厂商提供的板级芯片驱动补丁从而构成完整的内核。
Linux社区LTS 4.19.y分支信息请查看kernel官网。
内核组成模块,以开源Linux内核为基线, 合入了公共补丁:CVE补丁/OpenHarmony特性,在编译构建流程中针对具体芯片平台合入对应的架构驱动代码进行编译对应的内核镜像。所有补丁来源均遵守GPL-2.0协议。
-
CVE补丁
补丁所涉及的CVE(Common Vulnerabilities and Exposures)安全漏洞是通过NVD (https://nvd.nist.gov/)官方机构收集,且补丁已经进入LTS 4.19.y分支或主线,主要涉及存储(btrfs/scsi/)、网络(net/bpf/mwifiex) 、驱动(xen/nfc),对应CVE列表参考commit信息中CVE字段信息。
-
OpenHarmony特性
HDF驱动、binder ipc转发功能等特性支持。
-
特定芯片架构驱动补丁(比如Hi3516DV300)
vendor厂商提供的特定芯片架构驱动代码:
hisi_linux-4.19_hos_l2.patch: 在Hi3516DV300芯片上支持arm架构的内核启动(DTS等)及对应的drm/mmc等驱动的支持。
目录
kernel/
├── linux-4.19 # 4.19内核基线代码
├── linux/config/linux-4.19 # 内核config
│ └── standard_common_defconfig # 标准系统的内核的common defconfig
│ └── hi3516dv300_emmc_smp_hos_l2_defconfig # 厂商Hisilicon对应的开源开发板Hi3516dv300标准系统的defconfig
├── linux/patches/linux-4.19 # 内核patch及编译脚本
└── liteos_a # liteos内核基线代码
├── apps # 用户态的init和shell应用程序
├── arch # 体系架构的目录,如arm等
│ └── arm # arm架构代码
├── bsd # freebsd相关的驱动和适配层模块代码引入,例如USB等
├── compat # 内核接口兼容性目录
│ └── posix # posix相关接口
├── drivers # 内核驱动
│ └── char # 字符设备
│ ├── mem # 访问物理IO设备驱动
│ ├── quickstart # 系统快速启动接口目录
│ ├── random # 随机数设备驱动
│ └── video # framebuffer驱动框架
├── fs # 文件系统模块,主要来源于NuttX开源项目
│ ├── fat # fat文件系统
│ ├── jffs2 # jffs2文件系统
│ ├── include # 对外暴露头文件存放目录
│ ├── nfs # nfs文件系统
│ ├── proc # proc文件系统
│ ├── ramfs # ramfs文件系统
│ └── vfs # vfs层
├── kernel # 进程、内存、IPC等模块
│ ├── base # 基础内核,包括调度、内存等模块
│ ├── common # 内核通用组件
│ ├── extended # 扩展内核,包括动态加载、vdso、liteipc等模块
│ ├── include # 对外暴露头文件存放目录
│ └── user # 加载init进程
├── lib # 内核的lib库
├── net # 网络模块,主要来源于lwip开源项目
├── platform # 支持不同的芯片平台代码,如Hi3516DV300等
│ ├── hw # 时钟与中断相关逻辑代码
│ ├── include # 对外暴露头文件存放目录
│ └── uart # 串口相关逻辑代码
├── platform # 支持不同的芯片平台代码,如Hi3516DV300等
├── security # 安全特性相关的代码,包括进程权限管理和虚拟id映射管理
├── syscall # 系统调用
└── tools # 构建工具及相关配置和代码
约束
LiteOS:
Hi3518EV300默认使用jffs2文件系统,Hi3516DV300默认使用FAT文件系统。若要使用其他文件系统,需要新增适配。
使用
LiteOS使用说明
参见LiteOS-A内核README和LiteOS-M内核README的“使用说明”章节。
linux使用说明
如需使用上述patch,需要在内核代码完成对应芯片平台驱动补丁进行合入。
-
合入芯片平台驱动补丁
针对不同芯片平台合入对应的patch,以上述Hi3516DV300为例:
patch -p1 < device/hisilicon/hi3516dv300/sdk_linux/open_source/linux/hisi_linux-4.19_hos_l2.patch
须知: 由于OpenHarmony工程的编译构建流程中会拷贝kernel/linux-4.19的代码环境后进行打补丁动作,在使用OpenHarmony的版本级编译命令前,需要kernel/linux-4.19保持原代码环境。
以hi3516dv300开源开发板+ubuntu x86主机开发环境为例
场景1:版本级编译原生方式
使用工程的全量编译命令,编译生成uImage内核镜像
./build.sh --product-name Hi3516DV300 # 编译hi3516dv300的uImage内核镜像
场景2:单独编译修改后的内核
-
准备工作
准备编译环境,可以使用开源arm clang/gcc编译器,或者使用工程自带编译器。
进入工程主目录配置环境变量:
export PATH=`pwd`/prebuilts/clang/host/linux-x86/clang-r353983c/bin:`pwd`/prebuilts/gcc/linux-x86/arm/gcc-linaro-7.5.0-arm-linux-gnueabi/bin/:$PATH # 配置编译环境 MAKE_OPTIONES="ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- CC=clang HOSTCC=clang" # 使用工程项目自带的clang环境
-
修改内核代码或内核config (OpenHarmony提供对应平台的defconfig供参考)。
-
创建编译目录及生成内核.config。
make ${MAKE_OPTIONES} hi3516dv300_emmc_smp_hos_l2_defconfig # 使用自带的默认config 构建内核 -
编译生成对应的内核Image。
make ${MAKE_OPTIONES} -j32 uImage # 编译uImage内核镜像
相关仓
内核子系统
LiteOS:
drivers_liteos
kernel_liteos_a
kernel_liteos_m
device_qemu
prebuilts_lite_sysroot
Linux:
kernel_linux_patches
device_hisilicon_hi3516dv300
kernel_linux_config
kernel_linux-4.19