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

主要代码:

c 复制代码
#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系统系统调用实现的大致流程,梳理下整个脉络。

整个流程大致如下:

shell 复制代码
应用程序
  --> 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. ......
相关推荐
xq95272 分钟前
编程之路 2025年终总结 ,勇往直前 再战江湖
harmonyos
小虾米vivian6 分钟前
dmetl5 web管理平台 监控-流程监控 看不到运行信息
linux·服务器·网络·数据库·达梦数据库
TG:@yunlaoda360 云老大8 分钟前
如何将外部镜像文件导入华为云国际站代理商的IMS服务?
linux·运维·华为云
怀旧,9 分钟前
【Linux系统编程】13. Ext系列⽂件系统
android·linux·缓存
Vect__11 分钟前
Linux常见工具使用
linux·服务器
加成BUFF17 分钟前
树莓派安装下载及远程连接(共用手机热点)(SSH)(VNC)
linux·计算机·ssh·bash·树莓派·vnc
珠海西格电力24 分钟前
零碳园区边缘计算节点规划:数字底座的硬件部署与能耗控制方案
运维·人工智能·物联网·能源·边缘计算
Henry Zhu12324 分钟前
VPP中ACL源码详解第六篇:多核和性能优化实现以及调试与观测
运维·网络·网络协议·计算机网络·性能优化
苹果醋325 分钟前
Java设计模式实战:从面向对象原则到架构设计的最佳实践
java·运维·spring boot·mysql·nginx
wanhengidc27 分钟前
裸金属服务器都有哪些优势?
运维·服务器·安全·智能手机·生活