OpenHarmony簡介
技術架構
OpenHarmony整體遵從分層設計,從下向上依次為:內核層、系統(tǒng)服務層、框架層和應用層。系統(tǒng)功能按照“系統(tǒng) > 子系統(tǒng) > 組件”逐級展開,在多設備部署場景下,支持根據實際需求裁剪某些非必要的組件。OpenHarmony技術架構如下所示:

技術特性
硬件互助,資源共享
主要通過下列模塊達成
-
分布式軟總線
分布式軟總線是多設備終端的統(tǒng)一基座,為設備間的無縫互聯(lián)提供了統(tǒng)一的分布式通信能力,能夠快速發(fā)現(xiàn)并連接設備,高效地傳輸任務和數據。
-
分布式數據管理
分布式數據管理位于基于分布式軟總線之上的能力,實現(xiàn)了應用程序數據和用戶數據的分布式管理。
-
分布式任務調度
分布式任務調度基于分布式軟總線、分布式數據管理、分布式Profile等技術特性,構建統(tǒng)一的分布式服務管理(發(fā)現(xiàn)、同步、注冊、調用)機制,支持對跨設備的應用進行遠程啟動、遠程調用、綁定/解綁、以及遷移等操作,能夠根據不同設備的能力、位置、業(yè)務運行狀態(tài)、資源使用情況并結合用戶的習慣和意圖,選擇最合適的設備運行分布式任務
-
設備虛擬化
分布式設備虛擬化平臺可以實現(xiàn)不同設備的資源融合、設備管理、數據處理,將周邊設備作為手機能力的延伸,共同形成一個超級虛擬終端。
一次開發(fā),多端部署
OpenHarmony提供用戶程序框架、Ability框架以及UI框架,多終端軟件平臺API具備一致性,確保用戶程序的運行兼容性。一次開發(fā)、多端部署。
統(tǒng)一OS,彈性部署
OpenHarmony通過組件化和組件彈性化等設計方法,做到硬件資源的可大可小,在多種終端設備間,按需彈性部署,全面覆蓋了ARM、RISC-V、x86等各種CPU,從百KiB到GiB級別的RAM。
系統(tǒng)類型
OpenHarmony支持如下幾種系統(tǒng)類型:
| 類型 | 處理器 | 最小內存 | 能力 |
|---|---|---|---|
| 輕量系統(tǒng)(mini system) | MCU類處理器(例如Arm Cortex-M、RISC-V 32位的設備) | 128KiB | 提供多種輕量級網絡協(xié)議,輕量級的圖形框架,以及豐富的IOT總線讀寫部件等。 |
| 小型系統(tǒng)(small system) | 應用處理器(例如Arm Cortex-A的設備) | 1MiB | 提供更高的安全能力、標準的圖形框架、視頻編解碼的多媒體能力。 |
| 標準系統(tǒng)(standard system) | 應用處理器(例如Arm Cortex-A的設備) | 128MiB | 提供增強的交互能力、3D GPU以及硬件合成能力、更多控件以及動效更豐富的圖形能力、完整的應用框架。 |
內核層
內核子系統(tǒng): 采用多內核(Linux內核或者LiteOS)設計,支持針對不同資源受限設備選用適合的OS內核。內核抽象層(KAL,Kernel Abstract Layer)通過屏蔽多內核差異,對上層提供基礎的內核能力,包括進程/線程管理、內存管理、文件系統(tǒng)、網絡管理和外設管理等。
驅動子系統(tǒng): 驅動框架(HDF)是系統(tǒng)硬件生態(tài)開放的基礎,提供統(tǒng)一外設訪問能力和驅動開發(fā)、管理框架。 OpenHarmony驅動子系統(tǒng)采用C面向對象編程模型構建,通過平臺解耦、內核解耦,兼容不同內核,提供了歸一化的驅動平臺底座。
內核子系統(tǒng)
OpenHarmony針對不同量級的系統(tǒng),分別使用了不同形態(tài)的內核,分別為LiteOS和Linux。
| 系統(tǒng)級別 | 輕量系統(tǒng) | 小型系統(tǒng) | 標準系統(tǒng) |
|---|---|---|---|
| LiteOS | √ | √ | × |
| Linux | × | √ | √ |
LiteOS
OpenHarmony LiteOS內核是面向IoT領域的實時操作系統(tǒng)內核,基于Huawei LiteOS內核演進發(fā)展而來,包含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內核架構包含硬件相關層和硬件無關層。
硬件相關層按不同編譯工具鏈、芯片架構分類,提供統(tǒng)一的HAL接口;
硬件無關層,其中基礎內核模塊提供基礎能力,擴展模塊提供網絡、文件系統(tǒng)等組件能力,還提供錯誤處理、調測等能力,KAL模塊提供統(tǒng)一的標準接口。

注:ARM Cortex? 微控制器軟件接口標準(CMSIS:Cortex Microcontroller Software Interface Standard) 是 Cortex-M 處理器系列的與供應商無關的硬件抽象層
LiteOS-A
LiteOS-A內核重要的新特性如下:
新增了豐富的內核機制, 新增虛擬內存、系統(tǒng)調用、多核、輕量級IPC、DAC(Discretionary Access Control,自主訪問控制)等機制,豐富了內核能力;新增支持多進程,使得應用之間內存隔離、相互不影響
支持1200+標準POSIX接口 更加全面的支持POSIX標準接口,使得應用軟件易于開發(fā)和移植

Linux
OpenHarmony 中Linux內核從LTS版本中選擇合適的版本作為內核的基礎版本,目前已完成對Linux-4.19及Linux-5.10的適配及支持,4.19已經處于維護周期

下面是 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 特性
- 關聯(lián)線程組調度
- CPU 輕量級隔離
- New IP內核協(xié)議棧
- XPM(eXecutable Permission Manager)模塊
這些 Linux 內核增強特性,是否對我們現(xiàn)在的內核優(yōu)化有啥借鑒意義?
Patch合入流程
主要是按照kernel.mk中對應的patch路徑規(guī)則及命名規(guī)則,合入相應補丁
- 合入不同內核版本對應的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)
- 合入芯片平臺驅動補丁,以Hi3516DV300為例:
DEVICE_PATCH_DIR := $(OHOS_BUILD_HOME)/kernel/linux/patches/${KERNEL_VERSION}/$(DEVICE_NAME)_patch
DEVICE_PATCH_FILE := $(DEVICE_PATCH_DIR)/$(DEVICE_NAME).patch
- 修改自己所需要編譯的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版本引入,為開發(fā)者提供了整套插樁、注冊、調用接口,減少對內核的侵入修改,統(tǒng)一解耦框架,插樁接口可在多平臺間通用,使三方內核特性在不侵入或少侵入內核倉的情況下合入社區(qū)
HCK定義、注冊、調用接口及流程圖:

目前還只有 xpm、newip模塊使用
直接合入內核倉或適用patch方法,相比有哪些弊端?維護,移植
KAL
內核抽象層(KAL,Kernel Abstract Layer)通過屏蔽多內核差異,對上層提供基礎的內核能力,包括進程/線程管理、內存管理、文件系統(tǒng)、網絡管理和外設管理等
Linux內核中操作系統(tǒng)抽象層(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
驅動子系統(tǒng)
OpenHarmony驅動子系統(tǒng)采用C面向對象編程模型構建,通過平臺解耦、內核解耦,兼容不同內核,提供了歸一化的驅動平臺底座,旨在為開發(fā)者提供更精準、更高效的開發(fā)環(huán)境,力求做到一次開發(fā),多系統(tǒng)部署。
驅動架構
HDF(Hardware Driver Foundation)驅動框架,為驅動開發(fā)者提供驅動框架能力,包括驅動加載、驅動服務管理和驅動消息機制。
HDF驅動框架架構如下圖所示:

HDF驅動架構主要組成部分:
HDI層: (Hardware Device Interface,硬件設備統(tǒng)一接口),通過規(guī)范化的設備接口標準,為系統(tǒng)提供統(tǒng)一、穩(wěn)定的硬件設備操作接口。
HDF驅動框架: 提供統(tǒng)一的硬件資源管理、驅動加載管理、設備節(jié)點管理、設備電源管理以及驅動服務模型等功能,需要包含設備管理、服務管理、DeviceHost、PnPManager等模塊。
統(tǒng)一的配置界面: 支持硬件資源的抽象描述,屏蔽硬件差異,可以支撐開發(fā)者開發(fā)出與配置信息不綁定的通用驅動代碼,提升開發(fā)及遷移效率,并可通過HC-Gen等工具快捷生成配置文件。
操作系統(tǒng)抽象層: 提供統(tǒng)一封裝的內核操作相關接口,屏蔽不同系統(tǒng)操作差異,包含內存、鎖、線程、信號量等接口。
平臺驅動: 為外設驅動提供硬件(如:I2C/SPI/UART總線等平臺資源)操作統(tǒng)一接口,同時對硬件操作進行統(tǒng)一的適配接口抽象以便于不同平臺遷移。
外設驅動模型: 面向外設驅動,提供常見的驅動抽象模型。
驅動開發(fā)
平臺驅動
這里的平臺設備,泛指I2C/UART等總線、以及GPIO/RTC等特定硬件資源。
平臺驅動框架提供如下特性:
- 統(tǒng)一的平臺設備訪問接口(向上):對平臺設備操作接口進行統(tǒng)一封裝,屏蔽不同SoC平臺硬件差異以及不同OS形態(tài)差異,為系統(tǒng)及外設驅動提供標準的平臺設備訪問接口
- 統(tǒng)一的平臺驅動適配接口(向下):為平臺設備驅動提供統(tǒng)一的適配接口,使其只關注自身硬件的控制,而不必關注設備管理及公共業(yè)務流程。
- 提供設備注冊、管理、訪問控制等與SoC無關的公共能力。
目前支持的設備類型包括但不限于:ADC、DAC、GPIO、HDMI、I2C、I3C、MIPI_CSI、MIPI_DSI、MMC、Pin、PWM、Regulator、RTC、SDIO、SPI、UART、WatchDog等。
外設驅動
在HDF驅動框架及平臺驅動框架的基礎上,提供標準化的外設器件驅動,可以減少重復開發(fā);提供統(tǒng)一的外設驅動抽象模型,屏蔽驅動與不同系統(tǒng)組件間的交互,使得驅動更具備通用性。
目前支持的外設設備類型包括但不限于: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 | 提供用戶態(tài)驅動接口對系統(tǒng)依賴適配 |
| drivers/hdf_core/adapter/uhdf2 | 提供用戶態(tài)驅動框架對系統(tǒng)依賴適配 |
| drivers/peripheral | Display、Input、Sensor、WLAN、Audio、Camera等外設模塊硬件抽象層。 |
| drivers/interface | Display、Input、Sensor、WLAN、Audio、Camera等外設模塊HDI接口定義。 |
| drivers/external_device_manager | 擴展外部設備管理框架 |
思考
- 為啥大費力氣單獨弄一套HDF驅動框架?為了上層的大一統(tǒng)?不同內核,不同硬件平臺之間的遷移? 統(tǒng)一,多端
- KAL+HDF,微內核的雛形?為后面引入微內核做準備?
- 有什么好處優(yōu)勢?KAL+獨立的HDF驅動框架,分層解耦,驅動模型抽象,最小化修改最底層硬件適配,增加開發(fā)適配通用性,提高開發(fā)適配效率
- HCK,減少對社區(qū)內核侵入性,我們是否可以借鑒?
- 桌面系統(tǒng)內核一定非得是Linux內核?與內核解耦