鸿蒙OpenHarmony【轻量系统内核扩展组件(动态加载)】子系统开发

news2024/11/15 8:40:35

基本概念

在硬件资源有限的小设备中,需要通过算法的动态部署能力来解决无法同时部署多种算法的问题。以开发者易用为主要考虑因素,同时考虑到多平台的通用性,LiteOS-M选择业界标准的ELF加载方案,方便拓展算法生态。LiteOS-M提供类似于dlopen、dlsym等接口,APP通过动态加载模块提供的接口可以加载、卸载相应算法库。如图1所示,APP需要通过三方算法库所需接口获取对应信息输出,三方算法库又依赖内核提供的基本接口,如malloc等。APP加载所需接口,并对相关的未定义符号完成重定位后,APP即可调用该接口完成功能调用。目前动态加载组件只支持arm架构。此外,待加载的共享库需要验签或者限制来源,确保系统的安全性。

图1 LiteOS-M内核动态加载架构图

1

运行机制

符号表导出

共享库调用内核接口需要内核主动暴露动态库所需的接口,如图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 导出的符号表信息

2

ELF文件加载

加载过程中,根据ELF文件的句柄以及程序头表的段偏移可以得到需要加载到内存的LOAD段,一般有两个段,只读段及读写段,如下所示,可以用readelf -l查看ELF文件的LOAD段信息。如图3所示,根据相应的对齐属性申请物理内存,通过每个段的加载基址及偏移将代码段或数据段写入内存中。

$ readelf -l lib.so

Elf file type is DYN (Shared object file)
Entry point 0x5b4
There are 4 program headers, starting at offset 52

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  EXIDX          0x000760 0x00000760 0x00000760 0x00008 0x00008 R   0x4
  LOAD           0x000000 0x00000000 0x00000000 0x0076c 0x0076c R E 0x10000LOAD           0x00076c 0x0001076c 0x0001076c 0x0010c 0x00128 RW  0x10000
  DYNAMIC        0x000774 0x00010774 0x00010774 0x000c8 0x000c8 RW  0x4

 Section to Segment mapping:
  Segment Sections...
   00     .ARM.exidx
   01     .hash .dynsym .dynstr .rel.dyn .rel.plt .init .plt .text .fini .ARM.exidx .eh_frame
   02     .init_array .fini_array .dynamic .got .data .bss
   03     .dynamic

图3 ELF文件的加载过程

3

ELF文件链接

如图4所示,通过ELF文件的.dynamic段获取重定位表,遍历表中每一个需要重定位的条目,再根据需要重定位的符号名在共享库和内核提供的导出符号表中查找相应符号并更新相应的重定位信息。

图4 ELF文件的链接过程

4

ELF支持规格

ELF支持类型

编译共享库时,添加-fPIC可以编译出位置无关代码(-fPIC为编译选项),此时共享库文件类型为ET_DYN,其可以加载至任意有效的地址区间。

例:arm-none-eabi-gcc -fPIC –shared –o lib.so lib.c

ELF共享库编译链接选项

  1. “-nostdlib”编译链接选项:不依赖编译器中lib库。
  2. “-nostartfiles”编译链接选项:不依赖编译器中启动相关的文件。
  3. “-fPIC”编译选项:可编译位置无关的共享库。
  4. “-z max-page-size=4”链接选项:二进制文件中可加载段的对齐字节数为4,可节约内存,可用于动态库。
  5. “-mcpu=”需要指定对应的CPU架构。

以上就是本篇文章所带来的鸿蒙开发中一小部分技术讲解;想要学习完整的鸿蒙全栈技术。可以在结尾找我可全部拿到!
下面是鸿蒙的完整学习路线,展示如下:
1

除此之外,根据这个学习鸿蒙全栈学习路线,也附带一整套完整的学习【文档+视频】,内容包含如下

内容包含了:(ArkTS、ArkUI、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、鸿蒙南向开发、鸿蒙项目实战)等技术知识点。帮助大家在学习鸿蒙路上快速成长!

鸿蒙【北向应用开发+南向系统层开发】文档

鸿蒙【基础+实战项目】视频

鸿蒙面经

2

为了避免大家在学习过程中产生更多的时间成本,对比我把以上内容全部放在了↓↓↓想要的可以自拿喔!谢谢大家观看!
3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2156752.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux 21】线程安全

文章目录 🌈 一、线程互斥⭐ 1. 线程间互斥的相关概念🌙 1.1 临界资源和临界区🌙 1.2 互斥和原子性 ⭐ 2. 互斥量 mutex⭐ 3. 互斥量接口🌙 3.1 初始化互斥量🌙 3.2 销毁互斥量🌙 3.3 互斥量上锁&#x1f3…

原子结构与电荷

1.原子结构与电荷 1.1 物质到底是由什么构成的 阴极射线 电磁波 电磁波 我们生活中的物质。究竟是由什么构成的呢?这个问题其实困扰了人们很久。 1.提出“原子”的概念 早在2400年前,古希腊哲学家德莫克里特就提出了原子的概念。当时他就认为&…

H264-NAL

目录 错误日志NAL简介参考资料 错误日志 拉流时存在如下日志,会因为拉流失败导致之后的任务也停止 missing picture in access unit with size 16384 Invalid NAL unit size Error splitting the input into NAL units. 之后只要设置抓取异常后,重新拉流&#xff…

Python--TCP/UDP通信

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 一.客户端与服务端通信原理 1. 服务器端 服务器端的主要任务是监听来自客户端的连接请求,并与之建立连接,然后接收和发送数据。 创建套接字:首先&#xff0…

【Fastapi】参数获取,json和query

【Fastapi】参数获取,json和query 前言giteegithub query形式json传递同步方法使用json 前言 花了半个月的时间看了一本小说,懈怠了…今天更新下fastapi框架的参数获取 gitee https://gitee.com/zz1521145346/fastapi_frame.git github https://git…

一些迷你型信息系统 - 2

1 Linux内核数据结构信息查询 Linux内核的数据结构众多,成千上万,做一个程序来存储查询信息;自己录入数据; 代码字段最长可录入65535个字符;每个字段录入时长度超限会有红色告警; 其他的以后想到再做&#…

git-repo系列教程(4) windows平台下安装git-repo客户端

文章目录 简介操作步骤1.设置/root目录和/home目录2.打开本地终端3.安装python34.安装git5.安装git -repo6.查看版本 需要注意点 简介 git-repo天生是在Linux和MacOS下使用,在windows下直接安装运行会出错. 经过不断尝试,终于找到了一种简单的安装方法,在网上现在是独一份. …

Golang | Leetcode Golang题解之第424题替换后的最长重复字符

题目: 题解: func characterReplacement(s string, k int) int {cnt : [26]int{}maxCnt, left : 0, 0for right, ch : range s {cnt[ch-A]maxCnt max(maxCnt, cnt[ch-A])if right-left1-maxCnt > k {cnt[s[left]-A]--left}}return len(s) - left }f…

Maven-六、私服仓库

Maven 文章目录 Maven前言下载到本地解压启动并访问资源管理maven配置创建仓库选择使用仓库配置私服地址 资源上传配置资源上传操作私服连接中央仓库总结 前言 模块在引用依赖时一般先看本地仓库再看中央仓库,但是在团队开发中,不同人员要引用一些项目通…

某省公共资源交易电子平台爬虫逆向

目标网站 aHR0cHM6Ly9nZ3p5ZncuZnVqaWFuLmdvdi5jbi9pbmRleC9uZXc 一、抓包分析 1、请求参数加密 二、逆向分析 搜索定位加密参数位置 这里生成,扣取响应代码到本地即可 2、响应数据加密解密 xhr断点 向下跟栈,直到出现加密数据 解密函数 本地获取数据…

C语言中数组和字符串的联系

一、C语言中,数组和字符串 1、C语言中,定义一个数组后,数组名保存的是这个数组的首地址。类似一个指向数组第一个元素的指针,但是这个指针不能重新指向。2、字符串在C语言中是通过字符数组来实现的,也就是说字符串还是…

Fyne ( go跨平台GUI )中文文档-小部件 (五)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章: Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…

[SAP ABAP] 创建数据库视图和维护视图

数据准备 学校表(ZDBT_SCH_437) 学生表(ZDBT_STU_437) 学校表(ZDBT_SCH_437)与学生表(ZDBT_STU_437)字段 学校表(ZDBT_SCH_437)与学生表(ZDBT_STU_437)行数据明细 1.创建数据库视图 使用SE11创建数据库视图 填写视图名称ZV_DATABASEV_437,点击创建按钮 选择数据库视…

Linux——应用层协议HTTP

目录 前言 一HTTP协议 1认识URL 2urlencode 和 urldecode 3协议请求与响应格式 4代码实现 二HTTP常见Header 1Connection的报头 2Cookie和Session 2.1Cookie定义 2.2Cookie使用 2.3Session定义 2.4Session实现 四HTTP响应起始行 1状态码 2永久重定向与临时重定…

# wps必须要登录激活才能使用吗?

WPS 必须登录激活才能使用吗? 如下图,当我们使用WPS时,不登录会显示工具栏灰色不可用状态。 答:WPS 不一定要登录激活才能使用。 一、免费使用的情况 1、基础功能 在不登录的情况下,用户可以使用 WPS 的一些基础功…

模板:JDBC 连接数据库并实现 CRUD

目录 前期准备: 1. 连接数据库 1.1 第一种 1.2 第二种 2. 增加 3. 修改 4. 删除 5. 查询 5.1 查询某个记录 5.2 查询单列数据 使用时,直接复制再修改一些数据即可; 声明:在对文件/变量命名时,没有做到见名知…

鸿蒙设置,修改APP图标和名称

1、先看默认的图标和名称 2、打开项目开始设置自己需要的图标和名称 2.1找到 路径src\main\module.json5, 找到 abilities,下的,图标icon、名称label,label可以按住ctrl鼠标左键点击跳转 2.2先修改APP名称 1、ctrl鼠标左键点击…

Redis 字符串类型的典型应用场景

目录 1. 缓存功能 2. 计数功能 3. 共享会话(Session) 4. 手机验证码 前言 这里将详细介绍 Redis 字符串类型在实际开发中的几个典型应用场景,并提供相应的伪代码示例。 1. 缓存功能 场景描述 在许多Web应用中,数据通常需要…

【在Linux世界中追寻伟大的One Piece】验证TCP

目录 1 -> 验证TCP-windows作为client访问Linux 1.1 -> TCP client样例代码 1 -> 验证TCP-windows作为client访问Linux 1.1 -> TCP client样例代码 #include <winsock2.h> #include <iostream> #include <string>#pragma warning(disable : …

什么是Rspack?

Rspack 是一个基于 Rust 编写的高性能 JavaScript 打包工具&#xff0c;旨在提供与 webpack 生态系统的强兼容性&#xff0c;允许无缝替换 webpack&#xff0c;并提供极快的构建速度。 介绍 - Rspack 它由字节跳动 Web Infra 团队孵化&#xff0c;具有以下特点&#xff1a; 高…