鸿蒙OpenHarmony【轻量系统内核扩展组件(动态加载)】子系统开发
基本概念
在硬件资源有限的小设备中,需要通过算法的动态部署能力来解决无法同时部署多种算法的问题。以开发者易用为主要考虑因素,同时考虑到多平台的通用性,LiteOS-M选择业界标准的ELF加载方案,方便拓展算法生态。LiteOS-M提供类似于dlopen、dlsym等接口,APP通过动态加载模块提供的接口可以加载、卸载相应算法库。如图1所示,APP需要通过三方算法库所需接口获取对应信息输出,三方算法库又依赖内核提供的基本接口,如malloc等。APP加载所需接口,并对相关的未定义符号完成重定位后,APP即可调用该接口完成功能调用。目前动态加载组件只支持arm架构。此外,待加载的共享库需要验签或者限制来源,确保系统的安全性。
图1 LiteOS-M内核动态加载架构图
运行机制
符号表导出
共享库调用内核接口需要内核主动暴露动态库所需的接口,如图2所示,该机制将符号信息编译到指定段中,调用SYM_EXPORT宏即可完成对指定符号的信息导出。符号信息通过结构体SymInfo描述,成员包括符号名和符号地址信息,宏SYM_EXPORT通过__attribute__编译属性将符号信息导入.sym.*段中。
typedef struct {CHAR *name;UINTPTR addr;
} SymInfo;#define SYM_EXPORT(func) \
const SymInfo sym_##func __attribute__((section(".sym."#func))) = { \.name = #func, \.addr = (UINTPTR)func \
};
图2 导出的符号表信息
ELF文件加载
加载过程中,根据ELF文件的句柄以及程序头表的段偏移可以得到需要加载到内存的LOAD段,一般有两个段,只读段及读写段,如下所示,可以用readelf -l查看ELF文件的LOAD段信息。如图3所示,根据相应的对齐属性申请物理内存,通过每个段的加载基址及偏移将代码段或数据段写入内存中。
$ readelf -l lib.soElf file type is DYN (Shared object file)
Entry point 0x5b4
There are 4 program headers, starting at offset 52Program Headers:Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg AlignEXIDX 0x000760 0x00000760 0x00000760 0x00008 0x00008 R 0x4LOAD 0x000000 0x00000000 0x00000000 0x0076c 0x0076c R E 0x10000LOAD 0x00076c 0x0001076c 0x0001076c 0x0010c 0x00128 RW 0x10000DYNAMIC 0x000774 0x00010774 0x00010774 0x000c8 0x000c8 RW 0x4Section to Segment mapping:Segment Sections...00 .ARM.exidx01 .hash .dynsym .dynstr .rel.dyn .rel.plt .init .plt .text .fini .ARM.exidx .eh_frame02 .init_array .fini_array .dynamic .got .data .bss03 .dynamic
图3 ELF文件的加载过程
ELF文件链接
如图4所示,通过ELF文件的.dynamic段获取重定位表,遍历表中每一个需要重定位的条目,再根据需要重定位的符号名在共享库和内核提供的导出符号表中查找相应符号并更新相应的重定位信息。
图4 ELF文件的链接过程
ELF支持规格
ELF支持类型
编译共享库时,添加-fPIC可以编译出位置无关代码(-fPIC为编译选项),此时共享库文件类型为ET_DYN,其可以加载至任意有效的地址区间。
例:arm-none-eabi-gcc -fPIC –shared –o lib.so lib.c
ELF共享库编译链接选项
- “-nostdlib”编译链接选项:不依赖编译器中lib库。
- “-nostartfiles”编译链接选项:不依赖编译器中启动相关的文件。
- “-fPIC”编译选项:可编译位置无关的共享库。
- “-z max-page-size=4”链接选项:二进制文件中可加载段的对齐字节数为4,可节约内存,可用于动态库。
- “-mcpu=”需要指定对应的CPU架构。
以上就是本篇文章所带来的鸿蒙开发中一小部分技术讲解;想要学习完整的鸿蒙全栈技术。可以在结尾找我可全部拿到!
下面是鸿蒙的完整学习路线,展示如下:
除此之外,根据这个学习鸿蒙全栈学习路线,也附带一整套完整的学习【文档+视频】,内容包含如下:
内容包含了:(ArkTS、ArkUI、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、鸿蒙南向开发、鸿蒙项目实战)等技术知识点。帮助大家在学习鸿蒙路上快速成长!
鸿蒙【北向应用开发+南向系统层开发】文档
鸿蒙【基础+实战项目】视频
鸿蒙面经
为了避免大家在学习过程中产生更多的时间成本,对比我把以上内容全部放在了↓↓↓想要的可以自拿喔!谢谢大家观看!
相关文章:

鸿蒙OpenHarmony【轻量系统内核扩展组件(动态加载)】子系统开发
基本概念 在硬件资源有限的小设备中,需要通过算法的动态部署能力来解决无法同时部署多种算法的问题。以开发者易用为主要考虑因素,同时考虑到多平台的通用性,LiteOS-M选择业界标准的ELF加载方案,方便拓展算法生态。LiteOS-M提供类…...
Leetcode42. 接雨水
讲的好的视频讲解 【很难想象这up刷题的精神状态 Leetcode42. 接雨水】 https://www.bilibili.com/video/BV1MC411n7Af/?share_sourcecopy_web&vd_sourceafbacdc02063c57e7a2ef256a4db9d2a rm是right max的意思,lm是left max的意思 时间复杂度: O (…...
dbt snapshot命令及应用示例
DBT是一种功能强大的数据转换工具,它使数据分析师和工程师能够更有效地转换仓库中的数据。dbt的一个关键特性是能够创建快照,这是跟踪数据随时间变化的一种方法。本文带你一起完成创建和使用dbt快照的过程。 理解缓慢变化维度 缓慢变化维度(scd)是数据仓…...

JavaEE: 深入探索TCP网络编程的奇妙世界(四)
文章目录 TCP核心机制TCP核心机制四: 滑动窗口为啥要使用滑动窗口?滑动窗口介绍滑动窗口出现丢包咋办? TCP核心机制五: 流量控制 TCP核心机制 书接上文~ TCP核心机制四: 滑动窗口 为啥要使用滑动窗口? 之前我们讨论了确认应答策略,对每一个发送的数据段,都要给一个ACK确…...
面试金典题2.3
若链表中的某个节点,既不是链表头节点,也不是链表尾节点,则称其为该链表的「中间节点」。 假定已知链表的某一个中间节点,请实现一种算法,将该节点从链表中删除。 例如,传入节点 c(位于单向链…...
React 知识框架
在学习 React 时,可以按照以下知识框架来逐步学习和掌握 React 相关的知识: 1. **基础概念**: - 了解什么是 React 和为什么要使用 React。 - 理解 Virtual DOM(虚拟 DOM)的概念以及它如何提高性能。 - 学习…...

DeepCross模型实现推荐算法
1. 项目简介 A032-DeepCross项目是一个基于深度学习的推荐算法实现,旨在解决个性化推荐问题。随着互联网平台上信息和内容的爆炸式增长,用户面临着信息过载的困境,如何为用户提供高效、精准的推荐成为了关键。该项目背景基于现代推荐系统的发…...
【力扣】2376. 统计特殊整数
如果一个正整数每一个数位都是 互不相同 的,我们称它是 特殊整数 。 给你一个 正 整数 n ,请你返回区间 [1, n] 之间特殊整数的数目。 示例 1: 输入:n 20 输出:19 解释:1 到 20 之间所有整数除了 11 以外都…...
MySQL面试题——第一篇
1. 一张自增表里面总共有7条数据,删除了最后2条数据,重启数据库后又插入了一条数据,此时ID是几 表类型如果是MyISAM,那么id就是8 如果是InnoDB,那就是6 InnoDB表只会把自增主键的最大id记录在内存中,所以重…...

零停机部署的“秘密武器”:为什么 Kamal Proxy 能成为你架构中的不二之选?
你是不是也遇到过这种场景:网站正在升级,用户却被迫刷新无数次页面?服务器切换时瞬间掉线,客户体验差得没话说。更糟糕的是,流量高峰期来临时,正是业务最重要的时刻,结果因为停机而损失惨重。这个时候你一定会想:难道没有一种方式,能在不打断服务的情况下,平滑地进行…...

轻量级RSS阅读器Fusion
什么是 Fusion ? Fusion 是一款轻量级、自托管的 RSS 聚合器和阅读器。 软件主要特点: 自动分组、书签、搜索、嗅探信息导入/导出 OPML 文件支持 RSS、Atom、JSON 类型的 feed响应式、明/暗模式、PWA轻量级,自托管友好 使用 Golang 和 SQLit…...

Kubernetes从零到精通(11-CNI网络插件)
Kubernetes网络模型 Kubernetes的网络模型(Kubernetes Networking Model)旨在提供跨所有节点、Pod和服务的统一网络连接。它的核心理念是通过统一的网络通信规则,保证集群中的所有组件能够顺畅地相互通信。Kubernetes网络模型主要有以下几个关…...
【手机马达共振导致后主摄马达声音异常】
手机马达共振导致后主摄马达声音异常 问题根因解决方案其他易混淆 问题根因 当手机马达的震动频率和摄像头AF马达的一二阶震动频率处于共振频段的时候,手机马达震动时候有很大概率会干扰到后置摄像头的对焦马达正常工作,可能出现的影响有出现滋滋杂音&a…...
AUTOSAR UDS NRC
UDS NRC NRC 含义如表格所示 NRC代码描述含义0x00Ok没有错误,请求已成功执行0x01~0x0FISOSAEReservedISO 保留,暂时未定义0x10General reject服务请求被拒绝,原因不明确0x11Service not supported请求的服务不被支持0x12Sub-function not supported请求的子功能不被支持0x13…...

[数据结构]无头单向非循环链表的实现与应用
文章目录 一、引言二、线性表的基本概念1、线性表是什么2、链表与顺序表的区别3、无头单向非循环链表 三、无头单向非循环链表的实现1、结构体定义2、初始化3、销毁4、显示5、增删查改 四、分析无头单向非循环链表1、存储方式2、优点3、缺点 五、总结1、练习题2、源代码 一、引…...

认识结构体
目录 一.结构体类型的声明 1.结构的声明 2.定义结构体变量 3.结构体变量初始化 4.结构体的特殊声明 二.结构体对齐(重点难点) 1.结构体对齐规则 2.结构体对齐练习 (一)简单结构体对齐 (二)嵌套结构体对齐 3.为什么存在内存对齐 4.修改默认对齐数 三.结构体传参 1…...
Linux驱动.之MT7601,USB-WiFi网卡移植到X210开发板,wpa_supplicant配置工具的使用(一)
一、移植前 1、下载与解压无线网卡MT7601U驱动源码压缩包 DPO_MT7601U_LinuxSTA_3.0.0.4_20130913.tar.bz2 解压后有如下文件 ate common iwpriv_usage.txt Makefile mgmt phy README_STA_usb RT2870STA.dat sta_ate_iwpriv_usage.txt chips include m…...

ChatGPT 在国内使用的方法
AI如今很强大,聊聊天、写论文、搞翻译、写代码、写文案、审合同等等,ChatGPT 真是无所不能~ 作为一款出色的大语言模型,ChatGPT 实现了人类般的对话交流,最主要是能根据上下文进行互动。 接下来,我将介绍 ChatGPT 在国…...

思通数科开源产品:免费的AI视频监控卫士安装指南
准备运行环境: 确保您的服务器或计算机安装了Ubuntu 18.04 LTS操作系统。 按照产品要求,安装以下软件: - Python 3.9 - Java JDK 1.8 - MySQL 5.5 - Redis 2.7 - Elasticsearch 8.14 - FFmpeg 4.1.1 - RabbitMQ 3.13.2 - Minio (…...

阿里HPN-用于大型语言模型训练的数据中心网络
阿里巴巴HPN:用于大型语言模型训练的数据中心网络 探索大规模语言模型训练新方法:阿里巴巴HPN数据中心网络论文。 摘要 本文介绍了阿里云用于大型语言模型(LLM)训练的数据中心网络HPN。由于LLM和一般云计算之间的差异(例如,在流量模式和容错性方面)&…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...