11 开源鸿蒙OpenHarmony轻量系统源码分析
开源鸿蒙轻量系统源码分析
| 作者 | 将狼才鲸 |
|---|---|
| 日期 | 2024-03-28 |
一、前言
-
之前单独的LiteOS是通过Makefile编译的,当前的开源鸿蒙LiteOS-M和LiteOS-A是通过gn和ninja编译的。
-
Gitee官方只介绍了LiteOS-M的gn + ninja编译的流程,针对M3使用Keil编译的流程可能要参考社区代码
- harmonyos_next / stm32f103_simulator_keil
- OpenHarmony / kernel_liteos_m
- 使用Keil编译ARM Cortex-M3时,只需要kernel_liteos_m仓库和Keil工程仓库,不需要全量的OpenHarmony代码
-
由此可知,开源鸿蒙轻量系统只是简单的由LiteOS-M内核 + 一些芯片厂商的驱动组成
-
LiteOS-M 编码规范
- OpenHarmony轻内核编码规范
- OpenHarmony C语言编程规范
-
开发板移植流程
- 轻量系统STM32F407芯片移植案例
- 确定主频、选定默认打印输出的串口、printf标准输入输出重定向到默认串口、指定内存范围给内核、提供定时器给内核
- 移植芯片内核架构的流程
- LiteOS-M内核BUILD.gn编写指南
- 轻量系统STM32F407芯片移植案例
二、源码分析
- 源码下载:OpenHarmony / kernel_liteos_m
- 代码总量只有8M,代码量和uC/OS这类操作系统类似,因为代码量不多,因此一个人也是能分析完的;uC/OS虽然是开源、个人免费,但是商用是要收费的,所以ARM Cortex-M之类的芯片使用LiteOS-M或者RT-Thread这类操作系统还是蛮划算的,需要技术支持的话也可以找相关公司进行付费咨询。
- 代码结构如下:
jim@DESKTOP-SVP3BEM MINGW64 /d/1_git/openHarmony/kernel/liteos_m (master)
$ tree .
.
|-- BUILD.gn /* 老版本的LiteOS使用Makefile编译,新版本还可以用gn + ninja */
|-- Kconfig
|-- Makefile
|-- arch /* 硬件相关的代码,按内核IP公司 - IP系列进行区分 */
| |-- BUILD.gn
| |-- Kconfig
| |-- arm
| | |-- BUILD.gn
| | |-- Kconfig
| | |-- arm9
| | | .......
| | |-- common /* 相同芯片内核IP公司通用的函数和接口 */
| | | |-- BUILD.gn
| | | |-- los_common_interrupt.c
| | | `-- los_common_interrupt.h
| | |-- cortex-m3 /* M3只支持Keil编译,之后的版本如M4、Cortex-A则是在Linux + gcc下编译 */
| | | `-- keil /* 操作系统底层相关的支持,也是操作系统移植的重点 */
| | | |-- los_arch_atomic.h
| | | |-- los_arch_context.h
| | | |-- los_arch_interrupt.h
| | | |-- los_arch_timer.h
| | | |-- los_atomic.S
| | | |-- los_context.c
| | | |-- los_dispatch.S
| | | |-- los_exc.S
| | | |-- los_interrupt.c
| | | |-- los_startup.s /* 芯片上电后执行的第二行代码,芯片上电后的第一行代码一般都融合进了编译器中,由芯片原厂实现,写代码时看不到 */
| | | `-- los_timer.c /* 需要给操作系统的定时器接口,用于时间片轮转 */
| | |-- cortex-m33
| | | ......
| | |-- cortex-m4
| | | .......
| | |-- cortex-m55
| | | .......
| | |-- cortex-m7
| | | .......
| |-- csky
| | .......
| |-- include /* 所有芯片对操作系统暴露出的统一接口 */
| | |-- los_arch.h
| | |-- los_atomic.h
| | |-- los_context.h
| | |-- los_interrupt.h
| | |-- los_mpu.h
| | `-- los_timer.h
| |-- risc-v
| | ......
| `-- xtensa
| ......
| /* arch结构和Linux源码类似,一组类似的模块会暴露出统一的接口放在.h中,而.c的实现会分散到各处的不同模块,这和普通裸机代码中.c和.h在一起的结构不一样 */
|-- bundle.json
|-- components /* 支持的插件,可选 */
| |-- BUILD.gn
| |-- backtrace
| | |-- BUILD.gn
| | |-- los_backtrace.c
| | `-- los_backtrace.h
| |-- cppsupport /* 是否支持C++ */
| | |-- BUILD.gn
| | |-- los_cppsupport.c
| | `-- los_cppsupport.h
| |-- cpup
| | |-- BUILD.gn
| | |-- los_cpup.c
| | `-- los_cpup.h
| |-- debugtools
| | |-- BUILD.gn
| | |-- los_debugtools.h
| | |-- los_hwidump.c
| | |-- los_schedtrace.c
| | `-- los_stackdump.c
| |-- dynlink
| | |-- BUILD.gn
| | |-- los_dynlink.c
| | |-- los_dynlink.h
| | `-- script
| | `-- so_parse
| |-- exchook
| | |-- BUILD.gn
| | |-- los_exc_info.c
| | |-- los_exc_info.h
| | |-- los_exchook.c
| | `-- los_exchook.h
| |-- fs /* 操作系统的四大模块之一:文件系统 */
| | |-- BUILD.gn
| | |-- Kconfig
| | |-- fatfs /* FAT32最常用,可以用于U盘、Flash、网盘等 */
| | | |-- BUILD.gn
| | | |-- Kconfig
| | | |-- fatfs.c
| | | |-- fatfs.h
| | | `-- fatfs_conf.h
| | |-- littlefs
| | | ......
| | `-- vfs
| | ......
| |-- iar_tls
| | |-- los_iar_tls.c
| | `-- los_iar_tls.h
| |-- lmk
| | |-- BUILD.gn
| | |-- los_lmk.c
| | `-- los_lmk.h
| |-- lms
| | |-- BUILD.gn
| | |-- Kconfig
| | |-- lms_libc.c
| | |-- los_lms.c
| | |-- los_lms.h
| | `-- los_lms_pri.h
| |-- net /* 操作系统的第五大功能:通信/网络通信 */
| | |-- BUILD.gn
| | |-- lwip-2.1 /* 像网络、U盘之类的大型通信类驱动代码会很多,有时甚至会比操作系统本身的代码量还多 */
| | | |-- BUILD.gn
| | | |-- enhancement
| | | | `-- src
| | | | |-- fixme.c
| | | | `-- lwip_ifaddrs.c
| | | |-- lwip_porting.gni
| | | `-- porting
| | | |-- include
| | | | |-- arch
| | | | | |-- cc.h
| | | | | |-- perf.h
| | | | | `-- sys_arch.h
| | | | |-- lwip
| | | | | |-- api_shell.h
| | | | | |-- dhcp.h
| | | | | |-- inet.h
| | | | | |-- lwipopts.h
| | | | | |-- netdb.h
| | | | | |-- netif.h
| | | | | |-- netifapi.h
| | | | | `-- sockets.h
| | | | `-- lwipopts.h
| | | `-- src
| | | |-- api_shell.c
| | | |-- driverif.c
| | | |-- lwip_init.c
| | | |-- netdb_porting.c
| | | |-- sockets_porting.c
| | | `-- sys_arch.c
| | `-- test
| | ......
| |-- power /* 低功耗模块 */
| | |-- BUILD.gn
| | |-- los_pm.c
| | `-- los_pm.h
| |-- security /* 权限管理模块 */
| | |-- BUILD.gn
| | |-- box
| | | |-- BUILD.gn
| | | |-- los_box.c
| | | `-- los_box.h
| | |-- syscall
| | | |-- BUILD.gn
| | | |-- los_syscall.c
| | | |-- los_syscall.h
| | | |-- pthread_syscall.c
| | | `-- syscall_lookup.h
| | `-- userlib
| | `-- BUILD.gn
| |-- shell /* 命令行 */
| | |-- BUILD.gn
| | |-- Kconfig
| | |-- include
| | | |-- shcmd.h
| | | |-- shcmdparse.h
| | | |-- shell.h
| | | |-- shmsg.h
| | | `-- show.h
| | `-- src
| | |-- base
| | | |-- shcmd.c
| | | |-- shcmdparse.c
| | | |-- shmsg.c
| | | `-- show.c
| | `-- cmds
| | |-- date_shell.c
| | |-- fullpath.c
| | |-- mempt_shellcmd.c
| | |-- shell_shellcmd.c
| | |-- task_shellcmd.c
| | `-- vfs_shellcmd.c
| |-- signal
| | |-- BUILD.gn
| | |-- Kconfig
| | |-- los_signal.c
| | `-- los_signal.h
| `-- trace /* 调试程序用 */
| ......
|-- config.gni
|-- config_iccarm.gni
|-- drivers /* 操作系统四大模块之二:设备管理 */
| `-- Kconfig
| /* 具体的外设驱动由芯片原厂在上层文件夹的device和vendor文件夹中提供 */
|-- figures /* 几张介绍本操作系统内核结构的图片 */
| ......
|-- kal
| |-- BUILD.gn
| |-- Kconfig
| |-- cmsis /* ARM格式的中间件统一接口 */
| | |-- BUILD.gn
| | |-- Kconfig
| | |-- cmsis_liteos2.c
| | |-- cmsis_os.h
| | |-- cmsis_os2.h
| | |-- hos_cmsis_adp.h
| | `-- kal.h
| |-- libc /* C语言标准库,其实现一般都是在编译器中,由芯片原厂完成,所以这里只有头文件 */
| | |-- BUILD.gn
| | |-- Kconfig
| | |-- iccarm
| | | `-- BUILD.gn
| | |-- musl
| | | `-- BUILD.gn
| | `-- newlib
| | |-- BUILD.gn
| | `-- porting
| | |-- include
| | | |-- arpa
| | | | `-- inet.h
| | | |-- byteswap.h
| | | |-- dirent.h
| | | |-- endian.h
| | | |-- ifaddrs.h
| | | |-- limits.h
| | | |-- malloc.h
| | | |-- mqueue.h
| | | |-- net
| | | | |-- ethernet.h
| | | | |-- if.h
| | | | `-- if_arp.h
| | | |-- netdb.h
| | | |-- netinet
| | | | |-- if_ether.h
| | | | |-- in.h
| | | | |-- ip.h
| | | | `-- tcp.h
| | | |-- poll.h
| | | |-- semaphore.h
| | | |-- sys
| | | | |-- _pthreadtypes.h
| | | | |-- fcntl.h
| | | | |-- features.h
| | | | |-- ioctl.h
| | | | |-- mount.h
| | | | |-- prctl.h
| | | | |-- sched.h
| | | | |-- select.h
| | | | |-- socket.h
| | | | |-- statfs.h
| | | | |-- uio.h
| | | | `-- un.h
| | | `-- time.h
| | `-- src
| | |-- hook_adapt.c
| | `-- network
| | |-- htonl.c
| | |-- htons.c
| | |-- ntohl.c
| | `-- ntohs.c
| |-- libsec
| | `-- BUILD.gn
| `-- posix /* 操作系统给应用暴露出来的通用接口 */
| |-- BUILD.gn
| |-- Kconfig
| |-- include
| | |-- libc.h
| | |-- pipe_impl.h
| | |-- poll_impl.h
| | `-- rtc_time_hook.h
| `-- src
| |-- errno.c
| |-- libc.c
| |-- libc_config.h
| |-- malloc.c /* 操作系统的四大模块之三:内存管理 */
| |-- map_error.c
| |-- map_error.h
| |-- mqueue.c
| |-- mqueue_impl.h
| |-- pipe.c
| |-- poll.c
| |-- pthread.c
| |-- pthread_attr.c
| |-- pthread_cond.c
| |-- pthread_mutex.c
| |-- semaphore.c
| |-- signal.c
| |-- time.c
| `-- time_internal.h
|-- kernel /* 操作系统的四大模块之四:进程管理 */
| |-- BUILD.gn
| |-- include
| | |-- los_config.h
| | |-- los_event.h
| | |-- los_membox.h
| | |-- los_memory.h
| | |-- los_mux.h
| | |-- los_queue.h
| | |-- los_sched.h
| | |-- los_sem.h
| | |-- los_sortlink.h
| | |-- los_swtmr.h
| | |-- los_task.h
| | `-- los_tick.h
| `-- src
| |-- los_event.c
| |-- los_init.c
| |-- los_mux.c
| |-- los_queue.c
| |-- los_sched.c
| |-- los_sem.c
| |-- los_sortlink.c
| |-- los_swtmr.c
| |-- los_task.c
| |-- los_tick.c
| `-- mm
| |-- los_membox.c
| `-- los_memory.c
|-- liteos.gni
|-- testsuites /* 移植系统后进行自测用的,不用关心 */
| ......
|-- tools
| `-- mem_analysis.py
`-- utils|-- BUILD.gn|-- internal| |-- los_hook_types.h| `-- los_hook_types_parse.h|-- los_compiler.h|-- los_debug.c|-- los_debug.h /* 串口调试输出的级别 */|-- los_error.c|-- los_error.h /* 所有模块都会用的,要返回的错误码 */|-- los_hook.c|-- los_hook.h|-- los_list.h /* 链表,队列、模块缓存的基础 */`-- los_reg.h198 directories, 1571 files
- 基础的操作系统内核代码里没有太多可借鉴的软件结构,它们都是针对某一项功能而实现一项功能,通用的东西较少,接下来我会从操作系统移植的角度稍微分析一下。
相关文章:
11 开源鸿蒙OpenHarmony轻量系统源码分析
开源鸿蒙轻量系统源码分析 作者将狼才鲸日期2024-03-28 一、前言 之前单独的LiteOS是通过Makefile编译的,当前的开源鸿蒙LiteOS-M和LiteOS-A是通过gn和ninja编译的。 Gitee官方只介绍了LiteOS-M的gn ninja编译的流程,针对M3使用Keil编译的流程可能要参…...
专题:一个自制代码生成器(嵌入式脚本语言)之应用实例
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 专题:一个自制代码…...
Appium设备交互API
设备交互API指的是操作设备系统中的一些固有功能,而非被测程序的功能,例如模拟来电,模拟发送短信,设置网络,切换横竖屏,APP操作,打开通知栏,录屏等。 模拟来电 make_gsm_call(phon…...
Qlib-Server部署
Qlib-Server部署 介绍 构建Qlib服务器,用户可以选择: 一键部署Qlib服务器逐步部署Qlib服务器一键部署 Qlib服务器支持一键部署,用户可以选择以下两种方法之一进行一键部署: 使用docker-compose部署在Azure中部署使用docker-compose进行一键部署 按照以下步骤使用docker…...
CMC学习系列 (4):β段CMC可以作为一种中风治疗的生物标志物和治疗靶点
CMC学习系列:β段CMC可以作为一种中风治疗的生物标志物和治疗靶点 0. 引言1. 主要贡献2. 方法2.1 相干源动态成像2.2 源统计分析 3. 结果3.1 训练前后比较3.2 源代码分析3.3 皮质重叠的分组分析 4. 讨论5. 总结欢迎来稿 论文地址:https://www.sciencedirect.com/sci…...
jmeter中参数加密
加密接口常用的方式有: MD5,SHA,HmacSHA RSA AES,DES,Base64 压测中有些参数需要进行加密,加密方式已接口文档为主。 MD5加密 比如MD5加密的接口文档: 请求URL:http://101.34.221…...
YOLOv8改进 | 检测头篇 | 2024最新HyCTAS模型提出SAttention(自研轻量化检测头 -> 适用分割、Pose、目标检测)
一、本文介绍 本文给大家带来的改进机制是由全新SOTA分割模型(Real-Time Image Segmentation via Hybrid Convolutional-TransformerArchitecture Search)HyCTAS提出的一种SelfAttention注意力机制,论文中叫该机制应用于检测头当中(论文中的分割效果展现目前是最好的)。我…...
verilog设计-cdc:多比特信号跨时钟域(DMUX)
一、前言 多比特一般为数据,其在跨时钟域传输的过程中有多种处理方式,比如DMUX,异步FIFO,双口RAM,握手处理。本文介绍通过DMUX的方式传输多比特信号。 二、DMUX同步跨时钟域数据 dmux表示数据分配器,该方…...
服务器停止解析域名,但仍然可以访问到
1.centos7 如何刷新dns缓存 在CentOS 7上,DNS缓存由nscd(Name Service Cache Daemon)管理,如果系统上安装了nscd,可以通过清除nscd缓存来刷新DNS缓存。 要刷新DNS缓存,请执行以下命令: sudo …...
Centos系统与Ubuntu系统防火墙区别,以及firewalld、ufw和iptables三者之前的区别。
现在大多数Centos系统上的防火墙是firewalld,Ubuntu系统上是ufw,而iptables是最底层的防火墙工具。iptables是Linux系统中最早的防火墙工具,并且被许多不同的Linux发行版使用,包括CentOS和Ubuntu。然而,CentOS 7及更高…...
ES6 学习(三)-- es特性
文章目录 1. Symbol1.1 使用Symbol 作为对象属性名1.2 使用Symbol 作为常量 2. Iterator 迭代器2.1 for...of循环2.2 原生默认具备Interator 接口的对象2.3 给对象添加Iterator 迭代器2.4 ... 解构赋值 3. Set 结构3.1 初识 Set3.2 Set 实例属性和方法3.3 遍历3.4 相关面试题 4…...
使用ChatGPT的场景之gpt写研究报告,如何ChatGPT写研究报告
推荐写研究报告使用智能站: dayfire.cn/ 1. 确定研究主题 明确主题:在开始之前,你需要有一个清晰的研究主题。这将帮助AI更好地理解你的需求…...
librdkafka的简单使用
文章目录 摘要kafka是什么安装环境librdkafka的简单使用生产者消费者 摘要 本文是Getting Started with Apache Kafka and C/C的中文版, kafka的hello world程序。 本文完整代码见仓库,这里只列出producer/consumer的代码 kafka是什么 本节来源&#…...
【iOS ARKit】播放3D音频
3D音频 在前面系列中,我们了解如何定位追踪用户(实际是定位用户的移动设备)的位置与方向,然后通过摄像机的投影矩阵将虚拟物体投影到用户移动设备屏幕。如果用户移动了,则通过VIO 和 IMU更新用户的位置与方向信息&…...
ES学习日记(四)-------插件head安装和一些配套插件下载
前言 接上节,第三方插件选择了时间久,功能丰富,长得丑的head,head 插件在ES 5版本以前开箱即用非常简单,ES 5版本以后需要运行在node环境下,所以我们要先准备一下环境 一.安装Git 不装了,明儿再说,看会儿手机准备下班!!!!!!!!!...
flask+uwsgi+云服务器 部署服务端
参考:使用uwsgi部署flask 报错 “找不到Python应用程序,请检查启动日志以查找错误” 或者: no python application found, check your startup logs for errors debug 过程:查到Python uWSGI 安装配置 里面说,先写测…...
linux学习之路 -- 普通用户添加进sudoer列表
在Linux系统里,很多的操作普通用户是不能执行的,所以我们需要对普通用户进行提权操作,可我们会发现,一开始没有配置的话,是无法的提权操作的,下面我将介绍普通用户该如何配置sudoer列表。 首先以root 的身…...
【分类评估指标,精确率,召回率,】from sklearn.metrics import classification_report
from: https://zhuanlan.zhihu.com/p/368196647 多分类 from sklearn.metrics import classification_report y_true [0, 1, 2, 2, 2] y_pred [0, 0, 2, 2, 1] target_names [class 0, class 1, class 2] # print(classification_report(y_true, y_pred, targe…...
element-ui autocomplete 组件源码分享
紧接着 input 组件的源码,分享带输入建议的 autocomplete 组件,在 element-ui 官方文档上,没有这个组件的 api 目录,它的 api 是和 input 组件的 api 在一起的,看完源码之后发现,源码当中 autocomplete 组件…...
视觉SLAM理论与实践的学习链接汇总
仅供学习,在此感谢所有乐于分享知识的大佬们~ 一、 ORB_SLAM理论 视觉SLAM 前端 后端 回环 建图 1、 前端视觉里程计 1.1 特征点法 一文带你搞懂相机内参外参(Intrinsics & Extrinsics)-知乎 VSLAM 笔记——我们如何通过图像来计算位姿的变化ÿ…...
MS5803-14BA I²C驱动开发:嵌入式压力传感器实战指南
1. MS5803-14BA压力传感器库深度解析:面向嵌入式工程师的IC驱动开发实践1.1 传感器核心特性与工程定位MS5803-14BA是TE Connectivity(原Measurement Specialties)推出的高精度数字压力/温度复合传感器,采用MEMS压阻式传感原理与Δ…...
Rufus高效启动盘制作实战攻略:30分钟从入门到精通
Rufus高效启动盘制作实战攻略:30分钟从入门到精通 【免费下载链接】rufus The Reliable USB Formatting Utility 项目地址: https://gitcode.com/GitHub_Trending/ru/rufus 系统重装难题如何高效解决? 当你的电脑遭遇系统崩溃、病毒入侵或需要全…...
如何用MAT修复老照片?3个实用技巧让破损图像重获新生
如何用MAT修复老照片?3个实用技巧让破损图像重获新生 【免费下载链接】MAT MAT: Mask-Aware Transformer for Large Hole Image Inpainting 项目地址: https://gitcode.com/gh_mirrors/ma/MAT 想象一下,你从祖辈那里继承了一张珍贵的黑白老照片&a…...
杰理芯片不用代码 给别人下载升级方法
先打开sdk 打开cpu找到cpu里的tools 然后把tools整个压缩成压缩包发给要下载升级的人就好下载升级方式:先连接好升级工具 然后打开tools 之后双击download.bat一般出现数字 例如 3.7.25.67 就是一系列数字就是升级成功了...
GraphRAG大揭秘:微软如何用知识图谱让AI问答更精准,效率翻倍!
微软推出的GraphRAG通过引入知识图谱技术,有效解决了传统RAG在信息连接和归纳总结上的不足。GraphRAG利用大模型构建知识图谱,实现实体和关系的结构化表示,显著提升答案的准确度与完整性,并支持多跳推理。文章详细介绍了知识图谱的…...
内存检测从入门到精通:Memtest86+实战指南
内存检测从入门到精通:Memtest86实战指南 【免费下载链接】memtest86plus memtest86plus: 一个独立的内存测试工具,用于x86和x86-64架构的计算机,提供比BIOS内存测试更全面的检查。 项目地址: https://gitcode.com/gh_mirrors/me/memtest86…...
嵌入式WiFi开发 | 基于wireless_tools的交叉编译实战与移植指南
1. 嵌入式WiFi开发入门:为什么需要wireless_tools? 在嵌入式Linux开发中,网络连接能力往往是刚需。想象一下你的智能家居设备需要自动连接路由器,或者工业传感器需要通过WiFi上传数据——这些都离不开可靠的无线网络配置工具。这就…...
OpenHarmony标准系统选Linux内核,为啥首选LTS版本?聊聊4.19、5.10和6.6的适配实战
OpenHarmony标准系统选Linux内核:LTS版本决策逻辑与实战适配指南 当OpenHarmony标准系统遇上Linux内核选型,技术决策者们往往面临一个关键抉择:是追求前沿特性拥抱最新稳定版,还是坚守长期支持(LTS)版本的稳…...
OS17.【Linux】进程基础知识(1)
目录 1.浅层定义 程序和进程的区别 2.查看进程的方法 ps ajx top 查看/proc目录 编辑 PID 3.手动用ps查看自己运行的程序 在/proc手动查看自己运行的程序目录 杀死进程的常用方法 进程目录中的文件 cwd 理解"当前路径"的含义 4.如何管理一个进程 程…...
微信数据库密钥自动获取:从手动繁琐到一键提取的技术革新
微信数据库密钥自动获取:从手动繁琐到一键提取的技术革新 【免费下载链接】PyWxDump 获取微信账号信息(昵称/账号/手机/邮箱/数据库密钥/wxid);PC微信数据库读取、解密脚本;聊天记录查看工具;聊天记录导出为html(包含语音图片)。支…...
