openharmony5.0.0中kernel子系统编译构建流程概览(rk3568)

article/2025/6/7 22:55:38

概述

在梳理openharmony对linux内核做了哪些更改时,简单梳理了下kernel部分的编译构建流程,并根据源码做了简单论证。分享出来,希望对大家有所帮助。

系统版本:openharmony5.0.0

开发板:dayu200

编译环境:ubuntu22

执行流程

在kernel\linux\build\目录可以梳理出内核代码的如下执行流程:

在这里插入图片描述

其中BUILD.gn为openharmony中gn+ninja的正常编译流程,调用过程不再跟踪。

BUILD.gn

由执行流程图可知BUILD.gn是通过如下命令进行build_kernel.sh脚本的调用的。

 action("build_kernel") {//定义一个构建任务,action参数用于定义构建过程中的具体操作script = "build_kernel.sh"//指定了用于构建内核的脚本文件为`build_kernel.sh`sources = [ kernel_source_dir ]//指定内核源码目录//kernel/linux/$linux_kernel_versiondeps = [ ":check_build" ]//在执行构建内核任务之前,必须先完成`:check_build`任务,check_build为上文定义的check_build.sh脚本product_path = "vendor/$product_company/$product_name"//产品自定义相关的目录build_type = "standard"//构建类型为标准构建outputs = [ "$root_build_dir/packages/phone/images/$kernel_image" ]//构建的最终输出文件的位置和名称args = [//列出了传递给构建脚本的参数rebase_path(kernel_build_script_dir, root_build_dir),//1.重新计算内核构建脚本目录相对于构建目录根路径的路径,kernel_build_script_dir = "//kernel/linux/build";,定位到out输出的目录rebase_path("$root_out_dir/../KERNEL_OBJ"),//2.重新计算内核对象文件目录相对于某个输出目录的路径rebase_path("$root_build_dir/packages/phone/images"),//3.重新计算内核镜像文件放置目录相对于构建目录根路径的路径build_type,//4.构建类型,这里已经定义为"standard"target_cpu,//5.目标CPU架构,构建内核时需要指定针对哪种CPU架构进行构建product_path,//6.产品路径,已在前面定义device_name,//7.设备名称,表示正在构建内核的具体设备型号linux_kernel_version,//8.Linux内核版本号,表示正在构建的内核的具体版本]}

build_kernel.sh

build_kernel.sh脚本主要进行了kernel_module_build.sh脚本的调用

pushd ${1} #进入编译目录即:
./kernel_module_build.sh ${2} ${4} ${5} ${6} ${7} ${8}
.....对编译文件的复制操作,此处省略

kernel_module_build.sh

此文件主要是将对应的变量做对应的赋值,下面将DAYU200开发板中的编译方法(./build.sh --product-name rk3568)配置选项按实际情况进行了注释

export OUT_DIR=$1 #out
export BUILD_TYPE=$2 #standard
export KERNEL_ARCH=$3 #arm64
export PRODUCT_PATH=$4 #vendor/hihope/rk3568
export DEVICE_NAME=$5 #rk3568
export KERNEL_VERSION=$6#linux-5.10
LINUX_KERNEL_OUT=${OUT_DIR}/kernel/src_tmp/${KERNEL_VERSION}
export OHOS_ROOT_PATH=$(pwd)/../../..
....
make -f kernel.mk

由上可见最终在执行make时使用-f参数指定了kernel.mk文件

kernel.mk

为了简化说明下面将DAYU200(rk3568)开发板相关的内容保留之后的makefile文件保留了,如下:

PRODUCT_NAME=$(TARGET_PRODUCT) #产品的名称,取自环境变量`TARGET_PRODUCT
OHOS_BUILD_HOME := $(realpath $(shell pwd)/../../../) #构建系统的主目录,通过`realpath`和`pwd`命令计算出绝对路径#
KERNEL_SRC_TMP_PATH := $(OUT_DIR)/kernel/${KERNEL_VERSION} #内核源代码的临时路径
KERNEL_OBJ_TMP_PATH := $(OUT_DIR)/kernel/OBJ/${KERNEL_VERSION} #内核编译对象的临时路径#如果`BUILD_TYPE`为`standard`,则设置`BOOT_IMAGE_PATH`和`KERNEL_SRC_TMP_PATH`,并导出`KERNEL_SRC_DIR`环境变量
ifeq ($(BUILD_TYPE), standard)BOOT_IMAGE_PATH = $(OHOS_BUILD_HOME)/device/board/hisilicon/hispark_taurus/uboot/prebuiltsKERNEL_SRC_TMP_PATH := $(OUT_DIR)/kernel/src_tmp/${KERNEL_VERSION}export KERNEL_SRC_DIR=out/KERNEL_OBJ/kernel/src_tmp/${KERNEL_VERSION}
endifKERNEL_SRC_PATH := $(OHOS_BUILD_HOME)/kernel/linux/${KERNEL_VERSION}#内核源代码的实际路径
KERNEL_PATCH_PATH := $(OHOS_BUILD_HOME)/kernel/linux/patches/${KERNEL_VERSION}#内核补丁文件的路径
KERNEL_CONFIG_PATH := $(OHOS_BUILD_HOME)/kernel/linux/config/${KERNEL_VERSION}#内核配置文件的路径
PREBUILTS_GCC_DIR := $(OHOS_BUILD_HOME)/prebuilts/gcc#预编译的GCC工具链路径
CLANG_HOST_TOOLCHAIN := $(OHOS_BUILD_HOME)/prebuilts/clang/ohos/linux-x86_64/llvm/bin#预编译的Clang工具链路径#
KERNEL_HOSTCC := $(CLANG_HOST_TOOLCHAIN)/clang #用于主机编译的工具链
KERNEL_PREBUILT_MAKE := make #使用的`make`工具
CLANG_CC := $(CLANG_HOST_TOOLCHAIN)/clang #交叉编译工具链的前缀,初始为空KERNEL_CROSS_COMPILE :=
......KERNEL_TARGET_TOOLCHAIN := $(PREBUILTS_GCC_DIR)/linux-x86/aarch64/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/binKERNEL_TARGET_TOOLCHAIN_PREFIX := $(KERNEL_TARGET_TOOLCHAIN)/aarch64-linux-gnu-#选择相应的交叉编译工具链和前缀
.....KERNEL_CROSS_COMPILE += CC="$(CLANG_CC)"
KERNEL_CROSS_COMPILE += CROSS_COMPILE="$(KERNEL_TARGET_TOOLCHAIN_PREFIX)"
KERNEL_MAKE := \PATH="$(BOOT_IMAGE_PATH):$$PATH" \$(KERNEL_PREBUILT_MAKE) #设置`PATH`环境变量并使用`make`命令DEVICE_PATCH_DIR := $(OHOS_BUILD_HOME)/kernel/linux/patches/${KERNEL_VERSION}/$(DEVICE_NAME)_patch
DEVICE_PATCH_FILE := $(DEVICE_PATCH_DIR)/$(DEVICE_NAME).patch
KERNEL_IMAGE_FILE := $(KERNEL_SRC_TMP_PATH)/arch/$(KERNEL_ARCH)/boot/$(KERNEL_IMAGE)#生成的内核镜像文件路径
DEFCONFIG_FILE := $(DEVICE_NAME)_$(BUILD_TYPE)_defconfig#内核配置文件名
UNIFIED_COLLECTION_PATCH_FILE := ${OHOS_BUILD_HOME}/kernel/linux/common_modules/ucollection/apply_ucollection.sh#统一集合补丁脚本路径#export KBUILD_OUTPUT=$(KERNEL_OBJ_TMP_PATH)#导出`KBUILD_OUTPUT`环境变量,指定内核编译输出路径$(KERNEL_IMAGE_FILE):$(hide) echo "build kernel..."
......$(hide) rm -rf $(KERNEL_SRC_TMP_PATH);mkdir -p $(KERNEL_SRC_TMP_PATH);cp -arfL $(KERNEL_SRC_PATH)/* $(KERNEL_SRC_TMP_PATH)/ # 复制源代码$(hide) $(OHOS_BUILD_HOME)/drivers/hdf_core/adapter/khdf/linux/patch_hdf.sh $(OHOS_BUILD_HOME) $(KERNEL_SRC_TMP_PATH) $(KERNEL_PATCH_PATH) $(DEVICE_NAME) # 调用`patch_hdf.sh`脚本,应用设备驱动框架相关的补丁
......$(hide) cd $(KERNEL_SRC_TMP_PATH) && test -f $(DEVICE_PATCH_FILE) && patch -p1 < $(DEVICE_PATCH_FILE) || true #根据产品路径或设备名称,应用特定的补丁文件ifeq ($(UNIFIED_COLLECTION_PATCH_FILE), $(wildcard $(UNIFIED_COLLECTION_PATCH_FILE)))#如果存在获取进程cpu维测数据的脚本(提升获取CPU使用率的效率的服务),则执行该脚本,此脚本通过创建符号链接,可以方便地将位于不同目录的源码文件链接到内核构建目录中,避免了复制文件的过程$(hide) $(UNIFIED_COLLECTION_PATCH_FILE) $(OHOS_BUILD_HOME) $(KERNEL_SRC_TMP_PATH) $(DEVICE_NAME) $(KERNEL_VERSION)
endif#复制内核配置文件到源代码临时路径。使用`make`命令进行清理、配置、模块准备和编译。$(hide) cp -rf $(KERNEL_CONFIG_PATH)/. $(KERNEL_SRC_TMP_PATH)/$(hide) $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) distclean #清理$(hide) $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(DEFCONFIG_FILE) #配置
ifeq ($(KERNEL_VERSION), linux-5.10)$(hide) $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) modules_prepare #模块准备
endif$(hide) $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) -j64 $(KERNEL_IMAGE)  #编译
....
#定义一个伪目标`build-kernel`,依赖于`$(KERNEL_IMAGE_FILE)`。
#当运行`make build-kernel`时,会触发内核镜像的构建。
.PHONY: build-kernel
build-kernel: $(KERNEL_IMAGE_FILE)

📑$(hide) 通常用于 make 文件中的命令前缀。它会将命令的输出重定向到 /dev/null,从而隐藏命令的输出。调试时可以在调用 make 时使用 -s 选项来禁用所有命令的输出隐藏。

通过对以上的分析,可总结出我们比较关注的信息如下:

合入HDF补丁(patch_hdf.sh)

在第47行中可见HDF的补丁合入方法,合入不同内核版本对应的HDF内核补丁:

$(hide) $(OHOS_BUILD_HOME)/drivers/hdf_core/adapter/khdf/linux/patch_hdf.sh $(OHOS_BUILD_HOME) $(KERNEL_SRC_TMP_PATH) $(KERNEL_PATCH_PATH) $(DEVICE_NAME)

patch_hdf.sh脚本四个参数含义为:第一个入参为工程根目录路径,第二入参为内核目录路径,第三个入参为内核版本路径,第四个参数是当前设备名

此文件主要执行将hdf相关的补丁(kernel\linux\pathces\linux-5.10\rk3568_patch\hdf.patch)打入到系统中,具体的操作可以直接参看源码中的脚本文件drivers\hdf_core\adapter\khdf\linux\patch_hdf.sh

特定补丁文件

/kernel/linux/patches/${KERNEL_VERSION}/$(DEVICE_NAME)_patch目录中合入特定补丁$(DEVICE_NAME).patch,

$(hide) cd $(KERNEL_SRC_TMP_PATH) && test -f $(DEVICE_PATCH_FILE) && patch -p1 < $(DEVICE_PATCH_FILE) || true 
  • $(hide) :这是 make 工具的一个特性,用于隐藏命令的输出。它会将命令的输出重定向到 /dev/null,使得构建日志更加简洁,只显示关键信息。
  • cd $(KERNEL_SRC_TMP_PATH) :切换到内核源码所在的临时目录 $(KERNEL_SRC_TMP_PATH)
  • test -f $(DEVICE_PATCH_FILE) :检查设备补丁文件 $(DEVICE_PATCH_FILE) 是否存在。如果文件存在,命令返回真(退出码为 0);如果文件不存在,命令返回假(退出码为非 0)。
  • patch -p1 < $(DEVICE_PATCH_FILE) :应用补丁文件 $(DEVICE_PATCH_FILE)-p1 参数表示剥离补丁路径中的一层目录,即假设补丁是相对于内核源码根目录的一级目录创建的。
  • || true :如果前面的命令(即 test -fpatch 的组合)执行失败(返回非 0 退出码),则执行 true 命令,true 命令总是返回真(退出码为 0)。这可以避免构建过程因为补丁文件不存在或应用补丁失败而中断。

在我拿到的这份源码中没有rk3568.patch这个补丁,所以true很重要,表示此特定补丁为可选项

内核编译配置

在58行中可见如下脚本

 $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(DEFCONFIG_FILE)

经过上下文的分析可将此脚本解释为

make -C /out/kernel/src_tmp/linux-5.10 ARCH=arm64 CC=/prebuilts/clang/ohos/linux-x86_64/llvm/bin/clang CROSS_COMPILE=/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- rk3568_standard_defconfig
  • -C /out/kernel/src_tmp/linux-5.10 :指定了内核源码所在的目录,make 会进入该目录下进行编译操作,而不是在当前目录。

在这里插入图片描述

  • ARCH=arm64 :定义了目标架构为 ARM64,这意味着要编译出适用于 ARM64 架构设备的内核。
  • CC=/prebuilts/clang/ohos/linux-x86_64/llvm/bin/clang :指定了 C 编译器的路径,这里使用的是 Clang 编译器,它位于 /prebuilts/clang/ohos/linux-x86_64/llvm/bin/ 目录下。

在这里插入图片描述

  • CROSS_COMPILE=/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- :指定了交叉编译前缀,用于构建目标架构(ARM64)上的可执行文件。这个前缀指向了交叉编译工具链的目录,aarch64-linux-gnu- 表示该工具链是针对 aarch64 架构的 Linux 系统的。

在这里插入图片描述

  • rk3568_standard_defconfig :指定使用的内核配置文件。这个文件定义了内核的各种配置选项,如要包含的驱动、功能模块等。它会使内核编译过程按照该配置文件中的设置来进行,生成符合特定硬件平台(这里是 rk3568)需求的内核配置。

通过对上文的分析发现没有对kernel进行打补丁,后经搜索发现在device\board\hihope\rk3568\kernel\目录中包含对kernel的操作,如下

#device\board\hihope\rk3568\kernel\build_kernel.sh
patch -p1 < ${KERNEL_PATCH}#KERNEL_PATCH即为/kernel/linux/patches/linux-5.10/rk3568_patch/kernel.patch

此目录也包含厂家对系统其他的特殊处理,整体流程与上文分析的类似,此处不再详细说明。


http://www.hkcw.cn/article/uenDMcjnqP.shtml

相关文章

web攻防之SSTI 注入漏洞

知识简介 &#xff1a; 模版引擎和框架的区别 ssti的中文翻译 &#xff1a; 服务端的模版的注入 模版引擎 &#xff1a;前端的用于装饰优化html的模版 最简单的就是在腾讯会议中的聊天功能 框架 &#xff1a; 这个是一套独立存在的逻辑 如TP他是一个区别于php语法的后端逻辑…

【Linux】Linux 进程基础

参考博客&#xff1a;https://blog.csdn.net/sjsjnsjnn/article/details/125533127 进程 1.基本概念 课本概念&#xff1a;程序的一个执行实例&#xff0c;正在执行的程序等内核观点&#xff1a;担当分配系统资源&#xff08;CPU时间&#xff0c;内存&#xff09;的实体。 …

win32相关(内存映射文件)

内存映射文件 什么是内存映射文件 内存映射文件是一种将磁盘文件直接映射到进程地址空间的技术&#xff0c;允许应用程序像访问内存一样访问文件内容。这种机制提供了高效的文件I/O操作方法 #include<windows.h> #include<iostream>HANDLE hFile; HANDLE hMapFile;…

前端​​HTML contenteditable 属性使用指南

​​什么是 contenteditable&#xff1f; HTML5 提供的全局属性&#xff0c;使元素内容可编辑类似于简易富文本编辑器兼容性​​ 支持所有现代浏览器&#xff08;Chrome、Firefox、Safari、Edge&#xff09; 移动端&#xff08;iOS/Android&#xff09;部分键盘行为需测试 &l…

极智项目 | 基于PyQT实现的YOLOv12行人目标检测软件设计

基于YOLOv12的专业级行人目标检测软件应用 开发者: 极智视界 软件下载&#xff1a;链接 &#x1f31f; 项目特色 专业检测: 基于最新YOLOv12模型&#xff0c;专门针对行人检测优化现代界面: 采用PyQt5构建的美观、直观的图形用户界面高性能: 支持GPU加速&#xff0c;检测速…

[yolov11改进系列]基于yolov11引入可变形注意力DAttention的python源码+训练源码

【DAttention介绍】 DAT全称为Deformable Attention Transformer&#xff0c;其作用在于通过可变形注意力机制&#xff0c;同时包含了数据依赖的注意力模式&#xff0c;克服了常见注意力方法存在的内存计算成本高、受无关区域影响以及数据不可知等问题。相比一些只提供固定注意…

谷歌地图2022高清卫星地图手机版v10.38.2 安卓版 - 前端工具导航

谷歌地图2022高清卫星地图手机版是由谷歌公司推出的一款非常好用的手机地图服务软件&#xff0c;用户能够通过精准的导航和定位来查看地图&#xff0c;周边的商店等生活服务都会在地图上显示&#xff0c;用起来超级方便。 谷歌卫星高清地图 下载链接&#xff1a;夸克网盘分享 …

优化 Spring Boot API 性能:利用 GZIP 压缩处理大型有效载荷

引言 在构建需要处理和传输大量数据的API服务时&#xff0c;响应时间是一个关键的性能指标。一个常见的场景是&#xff0c;即使后端逻辑和数据库查询已得到充分优化&#xff0c;当API端点返回大型数据集&#xff08;例如&#xff0c;数千条记录的列表&#xff09;时&#xff0…

对接系统外部服务组件技术方案

概述 当前系统需与多个外部系统对接,然而外部系统稳定性存在不确定性。对接过程中若出现异常,需依靠双方的日志信息来定位问题,但若日志信息不够完整,会极大降低问题定位效率。此外,问题发生后,很大程度上依赖第三方的重试机制,若第三方缺乏完善的重试机制,就需要手动…

sudo docker exec -it backend bash 以交互方式(interactive)进入正在运行的 Docker 容器的命令行环境

sudo docker exec -it backend bash&#x1f50d; 总体作用 这条命令的作用是&#xff1a; 以交互方式&#xff08;interactive&#xff09;进入名为 backend 的正在运行的 Docker 容器的命令行环境。 你会进入容器的“终端”&#xff0c;就像登录到一个 Linux 系统一样&#…

深度思考:摆脱无效忙碌的核心策略

很多人在日复一日地努力工作&#xff0c;感到非常忙碌&#xff0c;但却始终看不到明显的进展&#xff0c;甚至陷入了一种“原地踏步”的感觉。 这背后&#xff0c;很可能是缺乏**深度思考&#xff08;Deep Thinking&#xff09;**所导致的。 为什么你每天都很忙却没有进展&…

JavaScript性能优化实战:从核心原理到工程实践的全流程解析

下面我给出一个较为系统和深入的解析&#xff0c;帮助你理解和实践“JavaScript 性能优化实战&#xff1a;从核心原理到工程实践的全流程解析”。下面的内容不仅解释了底层原理&#xff0c;也结合实际工程中的最佳模式和工具&#xff0c;帮助你在项目中贯彻性能优化理念&#x…

无需巨魔越狱也能使用的自定义emoji触摸轨迹,更新了!

新版本不会再有闪退问题&#x1f44c; 粒子效果体现出来还可以。自定义emoji轨迹小尾巴当然还可以自定义文本&#xff0c;非常有意思全版本支持&#xff0c;越狱包括无根&#xff0c;巨魔&#xff0c;自签都支持&#xff0c;所有应用都支持注入建议越狱可以用别的&#xff0c;毕…

【设计模式-3.7】结构型——组合模式

说明&#xff1a;本文介绍结构型设计模式之一的组合模式 定义 组合模式&#xff08;Composite Pattern&#xff09;又叫作整体-部分&#xff08;Part-Whole&#xff09;模式&#xff0c;它的宗旨是通过将单个对象&#xff08;叶子节点&#xff09;和组合对象&#xff08;树枝…

如何做好一份技术文档?—— 以 LM358 运算放大器手册为例谈技术文档的核心要素

在科技高速发展的当下&#xff0c;技术文档作为知识传递与技术交流的关键载体&#xff0c;其重要性不言而喻。一份优质的技术文档不仅能精准传达技术信息&#xff0c;还能助力读者快速理解复杂内容、推动技术落地。本文将结合《LM358 运算放大器手册》这一典型技术文档&#xf…

20250603在荣品的PRO-RK3566开发板的Android13下的命令行查看RK3566的温度

20250603在荣品的PRO-RK3566开发板的Android13下的命令行查看RK3566的温度 2025/6/3 11:58 RK3566的cpu运行效率 top rk3566_t:/ # rk3566_t:/ # rk3566_t:/ # cd /sys/class/thermal/ rk3566_t:/sys/class/thermal # ls -l rk3566_t:/sys/class/thermal # cd thermal_zone0/ r…

leetcode hot100(两数之和、字母异位词分组、最长连续序列)

两数之和 题目链接 参考链接&#xff1a; 题目描述&#xff1a; 暴力法 双重循环查找目标值 class Solution {public int[] twoSum(int[] nums, int target) {int[] res new int[2];for(int i 0 ; i < nums.length ; i){boolean isFind false;for(int j i 1 ; j …

JWTの求生记录

Token 三巨头通常指的是三种主流的令牌&#xff08;Token&#xff09;技术&#xff0c;它们各自解决了不同场景下的身份验证和授权问题 Token 验证是现代 Web 和移动应用中常用的身份验证方式&#xff0c;它比传统的 session-cookie 机制更适用于分布式系统和 RESTful API。 …

个人博客系统自动化测试报告

个人博客系统自动化测试报告 文章目录 个人博客系统自动化测试报告1. 项目背景2. 测试内容2.1 编写测试用例2.2 执行测试用例 1. 项目背景 个人博客系统由四个界面组成&#xff1a;博客登录页、博客列表页、博客详情页、博客发布页。通过使用Python Selenium实现web自动测试&a…

2025年人文发展与文化传播国际会议(ICHDCC 2025)

2025年人文发展与文化传播国际会议&#xff08;ICHDCC 2025&#xff09; 2025 International Conference on Humanistic Development and Cultural Communication 一、大会信息 会议简称&#xff1a;ICHDCC 2025 大会地点&#xff1a;中国绵阳 审稿通知&#xff1a;投稿后2-3…