

鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙看这篇或许真的够了 | 百篇博客分析HarmonyO...
source link: https://my.oschina.net/weharmony/blog/5028613
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

百万汉字注解 >> 精读鸿蒙源码,中文注解分析, 深挖地基工程,大脑永久记忆,四大码仓每日同步更新< gitee | github | csdn | coding >
百篇博客分析 >> 故事说内核,问答式导读,生活式比喻,表格化说明,图形化展示,主流站点定期更新中< oschina | 51cto | csdn | harmony >
本篇记录编译鸿蒙的过程,以备后续不用再去一大堆无效的误导式软文中搜寻芝麻大点有用的信息,那样真挺费时的.
-
先安装 Docker Desktop 下载windows版本一直下一步.
-
在windows下拉取
openharmony-docker
官方镜像,Docker方式获取编译环境 强烈推荐这么做.docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.3
2.36G, 拉取看网速, 大概10分钟后成功了,有了镜像
PS E:\harmony\kernel_liteos_a_note> docker images REPOSITORY TAG IMAGE ID CREATED SIZE swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker 0.0.3 50d0aa6ea9ba 2 weeks ago 2.36GB
-
vscode对docker的管理插件非常的强大,管理镜像和容器的工作就交给它了.
-
启动docker,创建好容器,本文的选择是这样的,当然大家可以灵活处理,命名.
容器创建成功后可以在 vscode 右键容器
inspect
查看到绑定的目录."HostConfig": { "Binds": [ "E:\\harmony\\code-1.0:/home/harmony", "E:\\harmony\\docker:/home/docker" ],
本文这样做的目的为了在windows上能方便的查看文件.
harmony
目录用于下载编译源码目录,另外一个docker
放其他无关文件 -
repo方式下载源码 进入容器,vscode右键容器
Attach shell
root@5e3abe332c5a:/home/harmony#repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify root@5e3abe332c5a:/home/harmony#repo sync -c
这个过程也是比网速.慢慢等吧.
-
下载完成之后的样子
root@5e3abe332c5a:/home/harmony# ls applications base build build.py developtools device docs domains drivers foundation kernel ohos_config.json prebuilts test third_party utils vendor
-
在源码的根目录执行如下命令安装hb
root@5e3abe332c5a:/home/harmony#python3 -m pip install --user build/lite
-
设置编译路径,选择当前路径
root@5e3abe332c5a:/home/harmony#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,这三个对应平台的关系如下
Hi3518:ipcamera_hispark_aries@hisilicon Hi3861:wifiiot_hispark_pegasus@hisilicon Hi3516:ipcamera_hispark_taurus@hisilicon
-
执行编译,过程大概20分钟
root@5e3abe332c5a:/home/harmony#hb build -f
-
查看编译结果
每个的目录含义如下
目录名 描述 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@5e3abe332c5a:/home/harmony/out/hispark_aries/ipcamera_hispark_aries# ls
args.gn build.log bundle_daemon_tool.map dev_tools libs NOTICE_FILE OHOS_Image.asm rootfs suites toggleButtonTest.map userfs vendor
bin build.ninja config etc liteos.bin obj OHOS_Image.bin rootfs_jffs2.img test toolchain.ninja userfs_jffs2.img
bm_tool.map build.ninja.d data foundation.map media_server.map OHOS_Image OHOS_Image.map server.map test_info unstripped usr
系列篇会详细讲解启动过程,此处进入bin目录瞅瞅都有些啥好宝贝.
root@5e3abe332c5a:/home/harmony/out/hispark_aries/ipcamera_hispark_aries/bin# ls
ai_server module_ActsAbilityMgrTest.bin module_ActsGraphVersionTest.bin module_ActsJFFS2CapabilityTest.bin module_ActsNFSTest.bin module_ActsSurfaceTest.bin os_dump
apphilogcat module_ActsBootstrapTest.bin module_ActsHeapBaseTest.bin module_ActsJFFS2DACTest.bin module_ActsParameterTest.bin module_ActsSysApiTest.bin query.bin
appspawn module_ActsBundleMgrTest.bin module_ActsHilogTest.bin module_ActsJFFS2Test.bin module_ActsPMSTest.bin module_ActsTimeApiTest.bin shell
bundle_daemon module_ActsColorTest.bin module_ActsIoApiTest.bin module_ActsKvStoreTest.bin module_ActsProcessApiTest.bin module_ActsTransformTest.bin tftp
CalcSubTest.bin module_ActsDyloadTest.bin module_ActsIpcMqTest.bin module_ActsListTest.bin module_ActsRectTest.bin module_ActsUiInterfaceTest1.bin wms_server
foundation module_ActsFutexApiTest.bin module_ActsIpcPipeTest.bin module_ActsLwipTest.bin module_ActsSamgrTest.bin module_ActsUtilApiTest.bin
hilogcat module_ActsGeometyr2dTest.bin module_ActsIpcSemTest.bin module_ActsMathApiTest.bin module_ActsSchedApiTest.bin module_ActsVFATCapabilityTest.bin
init module_ActsGraphicMathTest.bin module_ActsIpcShmTest.bin module_ActsMemApiTest.bin module_ActsSecurityDataTest.bin module_ActsVFATDACTest.bin
media_server module_ActsGraphMemApiTest.bin module_ActsIpcSignalTest.bin module_ActsNetTest.bin module_ActsSoftBusTest.bin module_ActsVFATTest.bin
这难道都是ELF格式可执行程序? 用readelf
命令试下shell
就知道了.果然是shell程序,加载它将创建激动人心的shell
进程
root@5e3abe332c5a:/home/harmony/out/hispark_aries/ipcamera_hispark_aries/bin# readelf -h shell
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: ARM
Version: 0x1
Entry point address: 0x1000
Start of program headers: 52 (bytes into file)
Start of section headers: 25268 (bytes into file)
Flags: 0x5000200, Version5 EABI, soft-float ABI
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 11
Size of section headers: 40 (bytes)
Number of section headers: 27
Section header string table index: 26
再随便选择一个module_ActsListTest.bin
看下,这些是鸿蒙用于测试的代码生成的.也是一个个的独立程序.可以在工程里找到他们的身影list_test.cpp
,ActsListTest.json
等文件
root@5e3abe332c5a:/home/harmony/out/hispark_aries/ipcamera_hispark_aries/bin# readelf -h module_ActsListTest.bin
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: ARM
Version: 0x1
Entry point address: 0xb000
Start of program headers: 52 (bytes into file)
Start of section headers: 172256 (bytes into file)
Flags: 0x5000200, Version5 EABI, soft-float ABI
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 11
Size of section headers: 40 (bytes)
Number of section headers: 27
Section header string table index: 26
解读
仔细比较下这两个ELF的头文件看哪里不一样
Entry point address: 0x1000
Entry point address: 0xb000
这是程序的入口地址,也就是大家熟悉的main()函数的地址,用户程序是从这个位置开始执行.
readelf
的功能很强大,有兴趣的可以玩下这个命令,看看elf里面究竟装的啥.
root@5e3abe332c5a:/home/harmony/out/hispark_aries/ipcamera_hispark_aries/bin# readelf -help
readelf: option requires an argument -- 'p'
Usage: readelf <option(s)> elf-file(s)
Display information about the contents of ELF format files
Options are:
-a --all Equivalent to: -h -l -S -s -r -d -V -A -I
-h --file-header Display the ELF file header
-l --program-headers Display the program headers
--segments An alias for --program-headers
-S --section-headers Display the sections' header
--sections An alias for --section-headers
-g --section-groups Display the section groups
-t --section-details Display the section details
-e --headers Equivalent to: -h -l -S
-s --syms Display the symbol table
--symbols An alias for --syms
--dyn-syms Display the dynamic symbol table
-n --notes Display the core notes (if present)
-r --relocs Display the relocations (if present)
-u --unwind Display the unwind info (if present)
-d --dynamic Display the dynamic section (if present)
-V --version-info Display the version sections (if present)
-A --arch-specific Display architecture specific information (if any)
-c --archive-index Display the symbol/file index in an archive
-D --use-dynamic Use the dynamic section info when displaying symbols
-x --hex-dump=<number|name>
Dump the contents of section <number|name> as bytes
-p --string-dump=<number|name>
Dump the contents of section <number|name> as strings
-R --relocated-dump=<number|name>
Dump the contents of section <number|name> as relocated bytes
-z --decompress Decompress section before dumping it
-w[lLiaprmfFsoRtUuTgAckK] or
--debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,
=frames-interp,=str,=loc,=Ranges,=pubtypes,
=gdb_index,=trace_info,=trace_abbrev,=trace_aranges,
=addr,=cu_index,=links,=follow-links]
Display the contents of DWARF debug sections
--dwarf-depth=N Do not display DIEs at depth N or greater
--dwarf-start=N Display DIEs starting with N, at the same depth
or deeper
--ctf=<number|name> Display CTF info from section <number|name>
--ctf-parent=<number|name>
Use section <number|name> as the CTF parent
--ctf-symbols=<number|name>
Use section <number|name> as the CTF external symtab
--ctf-strings=<number|name>
Use section <number|name> as the CTF external strtab
-I --histogram Display histogram of bucket list lengths
-W --wide Allow output width to exceed 80 characters
@<file> Read options from <file>
-H --help Display this information
-v --version Display the version number of readelf
具体的加载过程和elf格式后续有专门的篇幅详细介绍,此处不做说明.
用grep
过滤下干扰的*.bin,剩下的就是平台(Hi3518)需要内核创建的用户态进程.
root@5e3abe332c5a:/home/harmony/out/hispark_aries/ipcamera_hispark_aries/bin# ls | grep -v .bin
ai_server
apphilogcat
appspawn
bundle_daemon
foundation
hilogcat
init
media_server
os_dump
shell
tftp
wms_server
这些服务含义和仓库如下.
ai_server AI业务子系统 https://gitee.com/openharmony/ai_engine
apphilogcat 小型系统的流水日志功能 https://gitee.com/openharmony/hiviewdfx_hilog_lite
base\hiviewdfx\hilog_lite\services\apphilogcat\hiview_applogcat.c
appspawn 应用孵化模块进程 https://gitee.com/openharmony/startup_appspawn_lite
bundle_daemon 用户程序框架内部工具接口 https://gitee.com/openharmony/appexecfwk_appexecfwk_lite
foundation foundation系统进程 https://gitee.com/openharmony/distributedschedule_safwk_lite
hilogcat 管理日志打印 https://gitee.com/openharmony/hiviewdfx_hilog_lite
base\hiviewdfx\hilog_lite\services\hilogcat\hiview_logcat.c
init 用户态祖宗进程 1号进程, -> 鸿蒙内核源码分析(特殊进程篇)
media_server 播放模块框架实现 https://gitee.com/openharmony/multimedia_media_lite
os_dump 备份文件系统 utils\native\lite\os_dump\os_dump.c
shell 窥视内核的窗口 3号进程, -> 鸿蒙内核源码分析(shell篇)
tftp 传输文件 third_party\curl\lib\tftp.c
wms_server 窗口管理服务 https://gitee.com/openharmony/graphic_wms
在整个项目工程中能轻易找到他们的入口函数.比如appspawn
的启动过程
//base\startup\appspawn_lite\services\src\main.c
int main(int argc, char * const argv[])
{
sleep(1);
HILOG_INFO(HILOG_MODULE_HIVIEW, "[appspawn] main, enter.");
// 1. ipc module init
HOS_SystemInit();
// 2. register signal for SIGCHLD
SignalRegist();
// 3. keep process alive
HILOG_INFO(HILOG_MODULE_HIVIEW, "[appspawn] main, entering wait.");
while (1) {
// pause only returns when a signal was caught and the signal-catching function returned.
// pause only returns -1, no need to process the return value.
(void)pause();
}
}
鸿蒙将服务做成了组件,为最上层的应用程度提供管理/工具类的服务.但这些都是framework层的工作,超出了内核源码分析的范畴.希望后续有机会能去剖析它们.
鸿蒙源码百篇博客 往期回顾
喜欢请「点赞+关注+收藏」
-
各大站点搜 「鸿蒙内核源码分析」.欢迎转载,请注明出处.
Recommend
-
11
kernel_liteos_a_note: 鸿蒙内核源码注释中文版 点击目录和文件查看详细源码中文注解,走进内核的世界.
-
11
鸿蒙内核源码分析(位图管理篇) | 为何进程和线程调度优先级都是32级? | v19.02 - 鸿蒙内核源码分析的个人空间 - OSCHINA - 中文开源技术交流社区 鸿蒙内核源码注释中文版 【 Gitee仓 ...
-
14
百万汉...
-
12
百万汉字注解 >> 精读内核源码,中文注解分析, 深挖地基工程,大脑永久记忆,四大码仓每日同步更新< Gitee
-
10
百万汉字注解 >> 精读内核源码,中文注解分析, 深挖地基工程,大脑永久记忆,四大码仓每日同步更新< Gitee
-
24
百万汉...
-
12
...
-
6
百万汉字注解 >> 精读内核源码,中文注解分析, 深挖地基工程,大脑永久记忆,四大码仓每日同步更新< gitee
-
13
fork是如何做到调用一次,返回两次的 ?百万汉字注解 >> 精读内核源码,中文注解分析, 深挖地基工程,大脑永久记忆,四大码仓每日同步更新<
-
22
OpenHarmony | 鸿蒙研究站 | WeHarmony < 国内
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK