OpenHarmony之系统调用

背景

对于运行L0系统的硬件一般是mcu,资源有限,L0系统没有区分内核态和用户态,所有的代码都在内核态运行,所以不需要系统调用
L2系统用的是Linux内核,所以系统调用跟Linux Kernel的是一样的。
所以我们主要来看看L1系统中系统调用机制的是怎么实现的。

后面的分析基于如下版本:

  • OpenHarmony v3.3.2
  • musl v1.2.0

L1系统调用

对于运行L1系统的硬件一般集成了MMU,而且CPU有特权级别状态(状态寄存器的某些位),可以实现进程之间的隔离、内核态和用户态的隔离。系统调用就是在有内核态和用户态隔离的操作系统上,用户态进程访问内核态资源的一种方式

用户态c库

通常我们的应用不会直接调用系统调用,而是通过c库的库函数来间接调用。

OpenHarmony上层使用的C库是musl libc, c库的一些函数接口调到最下面就是系统调用接口了。

通过third_party/musl/src/internal/syscall.h文件中,各种宏的展开,最终都会变成类似与__syscall3等这样的函数(后面可能跟着不同的数字,代表传递参数的个数),而 musl libc 对于这些函数在不同硬件架构上有着不同的实现,这里以arm为例,

代码路径:third_party/musl/arch/arm/syscall_arch.h
主要代码:

#define __asm_syscall(...) do { \__asm__ __volatile__ ( "svc 0" \: "=r"(r0) : __VA_ARGS__ : "memory"); \return r0; \} while (0)
#endif

这里调用了SVC指令触发一个“特权调用”异常,并传递一些参数,这样会触发内核去处理该中断。

内核态中断处理

SVC中断后,内核就会去处理该中断。

中断异常处理的入口是在汇编代码:kernel/liteos_a/arch/arm/arm/src/los_hw_exc.S

SVC异常处理函数入口:_osExceptSwiHdl
最终会调用到所有系统调用的统一入口, 这里就是C代码实现了:OsArmA32SyscallHandle(kernel/liteos_a/syscall/los_syscall.c)

这里会根据系统调用号来查找对应的系统调用处理函数(syscall_lookup.h 中定义了对应的处理函数),然后通过这些处理函数和传递过来的参数,由此完成真正系统调用的过程,这里就不再一一分析了。

总结

本篇只是记录了一下OpenHarmony的L1系统系统调用实现的大致流程,梳理下整个脉络。

整个流程大致如下:

应用程序--> c库函数 (musl libc)--> 系统调用--> 触发`SVC`中断--> 内核态SVC异常处理函数--> 系统调用具体实现及返回

这里也不列举例子了,具体的可以自己去撸下代码。

为了能让大家更好的学习鸿蒙 (Harmony OS) 开发技术,这边特意整理了《鸿蒙 (Harmony OS)开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙 (Harmony OS)开发学习手册》

入门必看:https://qr21.cn/FV7h05

  1. 应用开发导读(ArkTS)
  2. 应用开发导读(Java)

HarmonyOS 概念:https://qr21.cn/FV7h05

  1. 系统定义
  2. 技术架构
  3. 技术特性
  4. 系统安全

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. 构建第一个JS应用
  4. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

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

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

相关文章

低代码开发平台助力搭建社区网格化管理系统

基于四维轻云的数字化三维社区管理平台,支持将社区三维模型以“户”为单位,批量生成单体化并关联其居民信息,快速构建出一户一证一档的管理模式;并可集成社区现有信息系统数据及传感资源,构建社区综合管理、人口管理、…

Java调用千帆大模型ERNIE-Bot-4实现联网问答

百度云: https://login.bce.baidu.com 对话测试: 示例代码: import okhttp3.*; import org.json.JSONObject;import java.io.*;class Sample {public static final String API_KEY "57fOrp****XCXD27";public static final String SECRET_KEY "KhNkIj****Ql…

iS-RPM2023.2.0.0新版本发布

引言 经过不断努力和精心打磨,我们带着全新版本的RPM产品与大家见面啦!本次更新将为广大流程分析师和质量管理员们提供更深入、更准确的洞察力,以帮助大家在数据驱动的决策中取得更卓越的成果。然而,让海量数据转化为可用的见解并不是一项容易的任务。我们理解数据分析师们…

C语言rand函数,srand函数,time函数实现随机数,及猜数字小游戏

怀心之所爱,奔赴山河 前言 最近在复习c的知识,想起之前写过一个猜数字小游戏,所以今天就把自己关于随机数的使用经验分享一下,希望对大家有帮助。 一.rand函数 1.函数的声明如下 可以看到,返回值是int类型&#xff…

vue如何实现局部刷新?

应用场景&#xff1a; 比如你要切换tap栏实现刷新下面form表单等&#xff0c;相当于刷新页面。 如何使用如下&#xff1a; <div v-if"isReloadData"> 比如你想刷新那个位置就把 v-if"isReloadData"写到那个标签上 </div> 在data中定义刷新标…

GPT编程(1)八分类图像数据集转换为二分类

一个核心问题就是要将这八类数据图片全部重命名&#xff0c;尝试了一步到位 有一个图像数据集&#xff0c;有八个类别amusement,anger,awe,contentment,disgust, excitement, fear,sadness的图片&#xff0c;每张图片被命名为“类别数字”。采用遍历的方式&#xff0c;按顺序阅…

熊猫目标检测数据集VOC格式1200张

熊猫是中国的国宝&#xff0c;也是世界上最受人喜爱的动物之一。熊猫以其独特的外貌和与生俱来的文化象征意义而闻名于世。它们是一种大型的食草动物&#xff0c;主要分布在中国中部地区的竹林和高山地带。 熊猫的身形圆润笨拙&#xff0c;黑白分明&#xff0c;拥有圆润的脸庞…

VerticalGridView适配触摸屏踩坑,触摸滑动时位置重置/闪烁问题

VerticalGridView是什么? VerticalGridView是安卓leanback库的列表组件,用于支持使用遥控器(按键事件)浏览列表。 它与RecyclerView的继承关系是:VerticalGridView→BaseGridView→RecyclerView 首先我想吐槽一下leanback的BaseGridView相关组件,耦合度较高,并且不允许开…

昇腾910平台安装驱动、固件、CANN toolkit、pytorch

本文使用的昇腾910平台操作系统是openEuler&#xff0c;之前没了解过&#xff0c;不过暂时感觉用起来和centOS差不多。系统架构是ARM&#xff0c;安装包基本都是带aarch64字样&#xff0c;注意和x86_64区别开&#xff0c;别下错了。 安装依赖 cmake 通过yum安装的cmake版本较…

基于YOLOv8的遥感SAR舰船小目标识别

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文摘要&#xff1a;基于YOLOv8的遥感SAR舰船小目标&#xff0c;阐述了整个数据制作和训练可视化过程 1.YOLOv8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的…

软件测试/测试开发丨Python常用数据结构-元组Tuple

元组的定义 元组是有序的、不可变的对象合集&#xff1b;元组使用小括号包围&#xff0c;各个对象之间使用逗号分隔&#xff1b;元组是异构的&#xff0c;可以包含多种数据类型。 元组的创建 方法一&#xff1a;使用逗号分隔方法二&#xff1a;通过小括号填充元素方法三&…

CENTOS docker拉取私服镜像

概述 docker的应用越来越多&#xff0c;安装部署越来越方便&#xff0c;批量自动化的镜像生成和发布都需要docker镜像的拉取。 centos6版本太老&#xff0c;docker的使用过程中问题较多&#xff0c;centos7相对简单容易。 本文档主要介绍centos系统安装docker和拉取docker私…

JavaScript中实现页面跳转的几种常用方法

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍在JavaScript中实现页面跳转的几种常用方法以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主收将持续更新学习记录获&#xff0c;友友们有任何问题…

『JavaScript』全面解析JavaScript中的防抖与节流技术及其应用场景

&#x1f4e3;读完这篇文章里你能收获到 理解防抖&#xff08;Debouncing&#xff09;和节流&#xff08;Throttling&#xff09;的概念&#xff1a;了解这两种性能优化技术如何帮助我们更有效地处理频繁触发的事件掌握防抖与节流的实现方法&#xff1a;学习如何在JavaScript中…

平升电子水库监管平台SQL注入漏洞复现

0x01 产品简介 唐山平升电子水库监管平台通过实时监测、数据分析、预警系统和远程控制等功能&#xff0c;为水库管理部门提供了一种全面、高效的数字化解决方案&#xff0c;帮助他们更好地管理和监控水库&#xff0c;确保水库的安全运行。 0x02 漏洞概述 唐山平升电子水库监…

数字身份验证:跨境电商如何应对账户安全挑战?

在数字化时代&#xff0c;随着跨境电商的蓬勃发展&#xff0c;账户安全问题逐渐成为行业和消费者关注的焦点。随着网络犯罪日益猖獗&#xff0c;用户的数字身份安全面临着更加复杂的威胁。本文将深入探讨数字身份验证在跨境电商中的重要性&#xff0c;并探讨各种创新技术和策略…

MPLS动态协议LDP配置示例

一、预习&#xff1a; MPLS是一种根据报文中携带的标签来转发数据的技术&#xff0c;两台LSR必须在它们之间转的数据 的标签使用上“达成共识”。LSR之间可以运行LDP来告知其他LSR本设备上的标签绑定信息&#xff0c;从而实现标签报文的正确转发。 LSR&#xff1a;Label Switch…

Linux 内核学习笔记: hlist 的理解

前言 最近阅读 Linux 内核时&#xff0c;遇到了 hlist&#xff0c;这个 hlist 用起来像是普通的链表&#xff0c;但是为何使用 hlist&#xff0c;hlist 是怎么工作的&#xff1f; 相关代码 hlist_add_head(&clk->clks_node, &core->clks); /*** clk_core_link_…

Android Context在四大组件及Application中的表现

文章目录 Android Context在四大组件及Application中的表现Context是什么Context源码Activity流程分析Service流程分析BroadcastReceiver流程分析ContentProvider流程分析Application流程分析 Android Context在四大组件及Application中的表现 Context是什么 Context可以理解…

深入ArkUI:深入实战组件text和text input

文章目录 Text组件介绍Text组件的属性方法Text:文本显示组件4.3TextInput组件实战案例:图片宽度控制页面本文总结要点回顾在今天的课程中,我们将深入学习ArkUI提供的基础组件,着重探讨text和text input两个组件。 Text组件介绍 Text组件是一个用于显示文本的组件,其主要作…