OpenHarmony之系统调用

news2024/11/26 2:02:01

背景

对于运行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://www.coloradmin.cn/o/1349893.html

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

相关文章

构建基础wlan网络 hcia无线

实验 旁挂组网 二层网络 ac为 dhcp的服务器给ap地址 s1给sta的ip地址 DHCP 业务为直接转发 实验步骤 第一步 poe 开启 poe en 开启 第二步 有线连接 vlan的配置 s1 vlan batch 100 101 连接的端口 port link-type trunk port trunk allow-pass …

阶段十-分布式-nginx服务器

一、Nginx简介 Nginx 是高性能的 HTTP 和反向代理的服务器,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。tomcat并发数量理论值是500,实际也就300左右。 1.2 正向代理 正向代理代理的是客户…

文心一言 VS 讯飞星火 VS chatgpt (170)-- 算法导论13.2 3题

三、用go语言,设在图 13-2 左边一棵树中,a、b和c 分别为子树a、β和γ中的任意结点。当结点 x 左旋之后,a、b和c 的深度会如何变化? 文心一言: 在二叉树中,左旋操作是改变节点的子节点顺序。原本的子节点…

高精度定位赛道爆发前夜 谁在强势崛起?|高工微报告

伴随着以NOA为代表的高阶智驾功能加速渗透,高精度定位赛道正进入快速增长通道。 整体技术链路上,高精度定位为高阶智驾的刚需:在“重地图、轻感知”阶段,其结合高精地图发挥作用;在“轻地图、重感知”阶段&#xff0c…

JavaScript编程进阶 – 迭代器

JavaScript编程进阶 – 迭代器 JavaScript Programming Advanced - Iterators By JacksonML 在JavaScript语言中,迭代器是对象(Object), 它事先定义好了一个序列,并在其终止时有可能地(潜在地)返回值。 本文简要介绍迭代器对象如…

收入支出记录,对需要的账目明细进行颜色标记

面对繁杂的账单和财务数据,你是否曾为记账而感到苦恼?别担心,我们为你带来了一款全新的记账软件——晨曦记账本,这不仅仅是一个简单的记账工具,更是你财务管理的得力助手。 所需工具: 一个【晨曦记账本】…

lora 生成图片 扭曲 的问题 【lora出图】

人物扭曲的原因: 生成图片是720X1080 而LORA制作的时候,图片大小为:512X512 所以生成图片时:设置为512X768 或512X512 生成图片大小以: 512X768 竖屏(海报) 768X512 横屏(动画&…

Unity 如何打造”大厅+子游戏”架构

现在越来越多的手机游戏开始要做成大厅子游戏模式,简单的说就是,进入大厅后有很多子游戏,玩家选哪个完,就更新下载哪个子游戏,下次就直接进去玩子游戏就可以了。这就是现在要做的 “大厅子游戏”架构,要拿一套这样的架…

浙大链协2023年终总结

2 0 2 4 元旦 快乐 龙腾虎跃 01 引言 俗话说:"币圈一天,人间十年",数字货币一天的涨跌可能抵上其他资产价格一年的波动幅度。而经历过漫长的熊市后,铭文的火爆十分生动地表述了这一口号...... 2023年,浙大链…

【Unity引擎技术整合】 Unity学习路线 | 知识汇总 | 持续更新 | 保持乐趣 | 共同成长

前言 本文对Unity引擎的知识进行了一个整理总结,基本包含了Unity中大部分的知识介绍。网上也有很多Unity相关的学习资料,但大多数都不成体系,学起来的时候难免会东奔西走的摸不着头脑。本文整理的多数文章都是有对应的系列性文章专栏&#x…

【C语言】Ubuntu 22上用GTK写GUI程序

一、GTK介绍 GTK (GIMP Toolkit) 是一个多平台的图形用户界面工具包。它最初是为图像处理程序 GIMP 开发的,后来演变成为许多操作系统上开发图形界面应用程序的通用库。GTK 是用C语言编写的,并且是自由和开源软件,遵循LGPL (GNU Lesser Gene…

x-cmd pkg | hyperfine - 命令行基准测试工具

目录 简介首次用户功能特点竞品和相关作品进一步阅读 简介 hyperfine 是一个用于命令行基准测试的开源工具,可以对多次命令运行的时间进行分析,帮助开发人员评估和比较不同命令或脚本的性能。它是用 Rust 语言开发的,可以在 Windows、macOS …

Redis 与 Spring: 解决序列化异常的探索之旅

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

【网络面试(5)】收发数据及断开服务器(四次挥手)

前面了解到服务器和客户端在创建套接字,建立连接后,就可以进入到下一步,双发可以互相发送和接收数据,本篇博客就来学习一下这个过程。  我们印象里,发送数据应该是我们在浏览器输入网址,敲击回车的一瞬间&…

RocketMQ 生产者源码分析:DefaultMQProducer、DefaultMQProducerImpl

🔭 嗨,您好 👋 我是 vnjohn,在互联网企业担任 Java 开发,CSDN 优质创作者 📖 推荐专栏:Spring、MySQL、Nacos、Java,后续其他专栏会持续优化更新迭代 🌲文章所在专栏&…

(九)上市企业实施IPD成功案例分享之——欧普

LED通用照明应用是LED照明应用市场的第一驱动力,由于LED照明技术发展迅速,以及成本快速下降,已成为全球主流照明光源。近年来,通过将智能控制模块嵌入LED通用照明终端,形成了具有自动控制、系统化控制等功能的智能照明…

Java8 Lambda 表达式

文章目录 🍉 Java 8 介绍🍉 Lambda 表达式🍅🍅 基础语法🍅🍅 案例 🍉 函数式接口🍅🍅 内置的四大核心函数式接口🍅🍅 案例 🍉 Java 8 …

linux驱动(一):led

本文主要探讨210的led驱动相关知识。 驱动 操作系统驱动硬件的代码,驱动上层是系统调用API,下层是硬件 宏内核:内核整体上为一个过程实现,运行在同一地址空间,相互调用简单高效 微内核:功能为独立过程,过程间通过IPC通信 …

国科大图像处理2023速通期末——汇总2017-2019

国科大2023.12.28图像处理0854期末重点 图像处理 王伟强 作业 课件 资料 一、填空 一个阴极射线管它的输入与输出满足 s r 2 sr^{2} sr2,这将使得显示系统产生比希望的效果更暗的图像,此时伽马校正通常在信号进入显示器前被进行预处理,令p…

上海亚商投顾:三大指数红盘收官!沪指今年累计跌3.7%

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 A股12月29日迎来2023年收官之战,三大股指延续反弹走势,最终集体红盘报收。纵观全年&am…