v50.03 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉坑指南 | 百篇博客分析OpenHarmony源码

原创
2021/04/23 09:20
阅读数 4.2W

颜渊死。子曰:“噫!天丧予!天丧予!” 《论语》:先进篇

在这里插入图片描述

百篇博客系列篇.本篇为:

v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉坑指南

编译构建相关篇为:

几点说明

  • kernel_liteos_a_note | 中文注解鸿蒙内核 是在 OpenHarmonykernel_liteos_a 基础上给内核源码加上中文注解的版本.与官方源码按月保持同步,同步历史如下:

    • 2021/10/09 -- 增加性能优化模块perf,优化了文件映射模块
    • 2021/09/14 -- common,extended等几个目录结构和Makefile调整
    • 2021/08/19 -- 各目录增加了BUILD.gn文件,文件系统部分文件调整
    • 2021/07/15 -- 改动不大,新增blackbox,hidumper,对一些宏规范化使用
    • 2021/06/27 -- 对文件系统/设备驱动改动较大,目录结构进行了重新整理
    • 2021/06/08 -- 对编译构建,任务,信号模块有较大的改动
    • 2021/05/28 -- 改动不大,主要针对一些错误单词拼写纠正
    • 2021/05/13 -- 对系统调用,任务切换,信号处理,异常接管,文件管理,shell做了较大更新,代码结构更清晰
    • 2021/04/21 -- 官方优化了很多之前吐槽的地方,点赞
    • 2020/09/16 -- 中文注解版起点
  • http://weharmonyos.com | 鸿蒙研究站

    分成三部分内容

  • 子系统注解仓库

    在给鸿蒙内核源码加注过程中发现仅仅注解内核仓库还不够,因为它关联了其他子系统,若对这些子系统不了解是很难完整的注解鸿蒙内核,所以也对这些关联仓库进行了部分注解,这些仓库包括:

鸿蒙版本

本篇主要采用 windows + docker 方式编译鸿蒙. 记录编译鸿蒙的过程,以备后续不用再去一大堆无效的误导式软文中搜寻芝麻大点有用的信息,那样真挺费时费心力. 针对不同场景使用不同的内核,openharmony有两个开源版本。

  • 标准系统版本,也叫(linux/L2/手机)版本,L2开源(2021/06/02),采用linux 4.19 内核,华为手机(HarmonyOS2.0)就是基于这个开源版本做的商业发行版本。
  • 轻量和小型系统版本,也叫(liteos/L0~L1/嵌入式)版本,L0开源(2020/09/10),L1开源(2020/12/02),采用 lite-os-a/m内核,主要针对嵌入式设备。

本篇详细说清楚这两个版本的编译过程。

安装 Docker Desktop

先安装 Docker Desktop 下载windows版本一直下一步.

拒绝没有技术含量的折腾,快速解决编译前的两个痛点条件:源码和编译环境

准备源码

源码获取有两种方式,一种直接gitee仓库(repo)下载,一种站点下载。因为代码量很大,加上网速,gitee仓库本身原因第一种方式存在失败概率,浪费时间,这种没技术含量的折腾没啥意义,本篇采用直接站点下载方式,请对照着前往下载。

源码获取路径

LTS版本源码    下载地址
----------------------------------------------------------------
标准版    https://repo.huaweicloud.com/harmonyos/os/2.0/code-2.0-canary.tar.gz 
轻量版    https://repo.huaweicloud.com/harmonyos/os/1.1.1/code-v1.1.1-LTS.tar.gz

源码下载后本篇统一放在了 E:\openharmony-docker-standard目录下,并创建好两个空目录,code-1.1.1 code-2.0-canary,当前内容如下: // windows 下 powershell

PS E:\openharmony-docker-standard> ls
    目录: E:\openharmony-docker-standard
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
da----          2021/4/2      9:27                code-1.1.1
da----         2021/6/17     18:24                code-2.0-canary
-a----         2021/6/18      9:44      323145491 code-1.1.1.tar.gz
-a----          2021/6/5     17:49     1433581461 code-2.0-canary.tar.gz 

为何要这么做,是因为要解压 tar包,但这两个tar包需在linux环境下完成解压,需要在docker中完成。

准备编译环境

要有编译环境,编译环境是个很头痛的事情,自己装太麻烦,也容易出错,但 docker真的很香,官方也帮我们解决了这个问题。同样的,两个版本对应两个docker镜像

LTS版本    镜像地址
----------------------------------------------------------------
标准版    docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.1 
轻量版    docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.5

鸿蒙task

编译标准版(L2/Linux)

选择标准版镜像创建容器,做好如图绑定选择 kernel_liteos_a_note

容器创建成功后可以在 vscode 右键容器inspect查看到绑定的目录.

"HostConfig": {
    "Binds": [
            "E:\\openharmony-docker-standard\\code-2.0-canary:/home/openharmony",
            "E:\\openharmony-docker-standard:/home/tar"
      ],

vscode 右键容器 attach shell,进入容器。

//第一步先解压`tar`包
root@95720c1a0803:/home/tar# ls
code-1.1.1  code-1.1.1.tar.gz  code-2.0-canary  code-2.0-canary.tar.gz
//执行解压命令
root@95720c1a0803:/home/tar# tar -zxvf code-2.0-canary.tar.gz
....
code-2.0-canary/base/iot_hardware/peripheral/interfaces/kits/iot_gpio.h
code-2.0-canary/base/iot_hardware/peripheral/interfaces/kits/iot_uart.h
code-2.0-canary/base/iot_hardware/peripheral/interfaces/kits/reset.h

//完成解压后 /home/openharmony 下直接就有可编译的源码了
root@95720c1a0803:/home/openharmony# ls
applications  build     build.sh      device  domains  foundation  kernel            out        productdefine  third_party  vendor
base          build.py  developtools  docs    drivers  interface   ohos_config.json  prebuilts  test           utils

//接着执行预处理脚本。
root@95720c1a0803:/home/openharmony# ../scripts/prepare.sh
...

//开始编译 ./build.sh --product-name {product_name}
//{product_name}为当前版本支持的平台。比如:Hi3516DV300等。 
root@95720c1a0803:/home/openharmony#./build.sh --product-name Hi3516DV300
...
//编译所生成的文件都归档在out/ohos-arm-release/目录下
root@95720c1a0803:/home/openharmony/out/ohos-arm-release# ls
NOTICE_FILES  build.ninja     clang_x64      dist                global          lib.unstripped     obj       sa_profile                  third_party
ace           build.ninja.d   common         distributeddatamgr  graphic         module_list_files  override  sorted_action_duration.txt  toolchain.ninja
args.gn       build.trace.gz  communication  exe.unstripped      hiviewdfx       multimedia         packages  src_installed_parts.json    updater
build.log     build_configs   developtools   gen                 js_declaration  multimodalinput    qrcode    src_sa_infos_tmp.json
//结果镜像输出在 out/ohos-arm-release/packages/phone/images/ 目录下
root@95720c1a0803:/home/openharmony/out/ohos-arm-release/packages/phone/images# ls
Hi3516DV300-emmc.xml  u-boot-hi3516dv300_emmc.bin

编译轻量版(L0~L1/LiteOS),

选择轻量版镜像创建容器,参考标准版图做绑定操作。 容器创建成功后可以在 vscode 右键容器inspect查看到绑定的目录.

"HostConfig": {
    "Binds": [
            "E:\\openharmony-docker-standard\\code-1.1.1:/home/openharmony",
            "E:\\openharmony-docker-standard:/home/tar"
      ],

vscode 右键容器 attach shell,进入容器。

//第一步先解压`tar`包
root@0d3e98ee3fe0:/home/tar# ls
code-1.1.1  code-1.1.1.tar.gz  code-2.0-canary  code-2.0-canary.tar.gz
//执行解压命令
root@0d3e98ee3fe0:/home/tar# tar -zxvf code-1.1.1.tar.gz
...
code-1.1.1/base/iot_hardware/peripheral/interfaces/kits/iot_gpio.h
code-1.1.1/base/iot_hardware/peripheral/interfaces/kits/iot_uart.h
code-1.1.1/base/iot_hardware/peripheral/interfaces/kits/reset.h
//完成解压后 /home/openharmony 下直接就有可编译的源码了
root@0d3e98ee3fe0:/home/openharmony# ls
applications  base  build  build.py  developtools  device  docs  domains  drivers  foundation  kernel  prebuilts  test  third_party  utils  vendor

编译项目选择 | hb set

root@0d3e98ee3fe0:/home/openharmony# hb set
[OHOS INFO] Input code path: .
OHOS Which product do you need?  (Use arrow keys)

hisilicon
❯ ipcamera_hispark_aries
wifiiot_hispark_pegasus
ipcamera_hispark_taurus

直接回车,本篇选择了ipcamera_hispark_aries

编译命令 | hb env

设置路径成功后,可查看下当前设置信息

root@0d3e98ee3fe0:/home/openharmony# hb env
[OHOS INFO] root path: /home/openharmony
[OHOS INFO] board: hispark_aries
[OHOS INFO] kernel: liteos_a
[OHOS INFO] product: ipcamera_hispark_aries
[OHOS INFO] product path: /home/openharmony/vendor/hisilicon/hispark_aries
[OHOS INFO] device path: /home/openharmony/device/hisilicon/hispark_aries/sdk_liteos

编译巨坑 | llvm 10 -> llvm9

编译过程中可能会有 cJSON/libcjson_shared.cJSON.o 错误,将 llvm 10 换成 llvm9 编译,这是个巨坑.

编译命令 | hb build -f

因docker编译速度较慢,为快速编译,本篇将测试子系统去除,这样可以少编译一半测试的文件,去除方法如下,前往 ..\code-1.1.1\vendor\hisilicon\hispark_aries\config.json 删除test子系统

  {
    "subsystem": "vendor",
    "components": [
      { "component": "middleware", "features":[] },
      { "component": "hi3518ev300_init", "features":[] },
      { "component": "hardware", "features":[] }
    ]
  },
  //删除test子系统 (可选)
  {
    "subsystem": "ai",
    "components": [
      { "component": "ai_engine", "features":[] }
    ]
  }

root@0d3e98ee3fe0:/home/openharmony# hb build -f
...
[OHOS INFO] [965/974] SOLINK ./librecorder_lite.so
[OHOS INFO] [966/974] STAMP obj/foundation/multimedia/media_lite/frameworks/recorder_lite/media_lite.stamp
[OHOS INFO] [967/974] SOLINK ./libplayer_lite.so
[OHOS INFO] [968/974] STAMP obj/foundation/multimedia/media_lite/services/media_ndk.stamp
[OHOS INFO] [969/974] STAMP obj/foundation/multimedia/media_lite/services/media_lite.stamp
[OHOS INFO] [970/974] STAMP obj/build/lite/ohos.stamp
[OHOS INFO] [971/974] SOLINK ./libaudio_lite_api.so
[OHOS INFO] [972/974] STAMP obj/foundation/multimedia/media_lite/frameworks/player_lite/media_lite.stamp
[OHOS INFO] [973/974] ACTION //build/lite:gen_rootfs(//build/lite/toolchain:linux_x86_64_ohos_clang)
[OHOS INFO] [974/974] STAMP obj/build/lite/gen_rootfs.stamp
[OHOS INFO] ipcamera_hispark_aries build success
//会多出一个`out`目录,每个的目录含义如下
root@0d3e98ee3fe0:/home/openharmony# ls
applications  build     developtools  docs     drivers     kernel            out        test         utils
base          build.py  device        domains  foundation  ohos_config.json  prebuilts  third_party  vendor
目录名          描述
applications    应用程序样例,包括wifi-iot,camera等
base            基础软件服务子系统集&硬件服务子系统集
build           组件化编译、构建和配置脚本
docs            说明文档
domains         增强软件服务子系统集
drivers         驱动子系统
foundation      系统基础能力子系统集
kernel          内核子系统
prebuilts       编译器及工具链子系统
test            测试子系统
third_party     开源第三方组件
utils           常用的工具集
vendor          厂商提供的软件
build.py        编译脚本文件
out             编译后生成

编译输出 | out 目录

输出目录 : out/hispark_aries/ipcamera_hispark_aries

root@0d3e98ee3fe0:/home/openharmony/out/hispark_aries/ipcamera_hispark_aries# ls
args.gn      build.ninja             data            gen               NOTICE_FILE     OHOS_Image.bin    server.map       userfs
bin          build.ninja.d           dev_tools       libs              obj             OHOS_Image.map    test             userfs_jffs2.img
bm_tool.map  bundle_daemon_tool.map  etc             liteos.bin        OHOS_Image      rootfs_jffs2.img  test_info        vendor
build.log    config                  foundation.map  media_server.map  OHOS_Image.asm  rootfs.tar        toolchain.ninja

百篇博客分析.深挖内核地基

  • 给鸿蒙内核源码加注释过程中,整理出以下文章。内容立足源码,常以生活场景打比方尽可能多的将内核知识点置入某种场景,具有画面感,容易理解记忆。说别人能听得懂的话很重要! 百篇博客绝不是百度教条式的在说一堆诘屈聱牙的概念,那没什么意思。更希望让内核变得栩栩如生,倍感亲切.确实有难度,自不量力,但已经出发,回头已是不可能的了。 😛
  • 与代码有bug需不断debug一样,文章和注解内容会存在不少错漏之处,请多包涵,但会反复修正,持续更新,v**.xx 代表文章序号和修改的次数,精雕细琢,言简意赅,力求打造精品内容。

按功能模块:

基础工具 加载运行 进程管理 编译构建
双向链表 位图管理 用栈方式 定时器 原子操作 时间管理 ELF格式 ELF解析 静态链接 重定位 进程映像 进程管理 进程概念 Fork 特殊进程 进程回收 信号生产 信号消费 Shell编辑 Shell解析 编译环境 编译过程 环境脚本 构建工具 gn应用 忍者ninja
进程通讯 内存管理 前因后果 任务管理
自旋锁 互斥锁 进程通讯 信号量 事件控制 消息队列 内存分配 内存管理 内存汇编 内存映射 内存规则 物理内存 总目录 调度故事 内存主奴 源码注释 源码结构 静态站点 时钟任务 任务调度 任务管理 调度队列 调度机制 线程概念 并发并行 CPU 系统调用 任务切换
文件系统 硬件架构
文件概念 文件系统 索引节点 挂载目录 根文件系统 字符设备 VFS 文件句柄 管道文件 汇编基础 汇编传参 工作模式 寄存器 异常接管 汇编汇总 中断切换 中断概念 中断管理

百万汉字注解.精读内核源码

WeHarmony/kernel_liteos_a_note

鸿蒙研究站 | 每天死磕一点点,原创不易,欢迎转载,但请注明出处。

展开阅读全文
加载中
点击加入讨论🔥(1) 发布并加入讨论🔥
1 评论
3 收藏
1
分享
返回顶部
顶部