OpenHarmony 内核源码分析(系统调用篇) | 开发者永远的口头禅

🚥往期推文全新看点(文中附带最新·鸿蒙全栈笔记)

1️⃣ 鸿蒙(HarmonyOS)北向开发知识点记录~

2️⃣ 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~

3️⃣ 鸿蒙应用开发与鸿蒙系统开发哪个更有前景?

4️⃣ 嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~

5️⃣ 对于大前端开发来说,转鸿蒙开发究竟是福还是祸?

6️⃣ 鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选?

7️⃣ 记录一场鸿蒙开发岗位面试经历~

8️⃣ 持续更新中……


本篇通过一张图和七段代码详细说明系统调用的整个过程,代码一捅到底,直到汇编层再也捅不下去.
先看图,这里的模式可以理解为空间,因为模式不同运行的栈空间就不一样.

过程解读

  • 在应用层main中使用系统调用mq_open(posix标准接口)
  • mq_open被封装在库中,这里直接看库里的代码.
  • mq_open中调用syscall,将参数传给寄出器 R7,R0~R6
  • SVC 0 完成用户模式到内核模式(SVC)的切换
  • _osExceptSwiHdl运行在svc模式下.
  • PC寄存器直接指向_osExceptSwiHdl处取指令.
  • _osExceptSwiHdl是汇编代码,先保存用户模式现场(R0~R12寄存器),并调用OsArmA32SyscallHandle完成系统调用
  • OsArmA32SyscallHandle中通过系统调用号(保存在R7寄存器)查询对应的注册函数SYS_mq_open
  • SYS_mq_open是本次系统调用的实现函数,完成后return回到OsArmA32SyscallHandle
  • OsArmA32SyscallHandle再return回到_osExceptSwiHdl
  • _osExceptSwiHdl恢复用户模式现场(R0~R12寄存器)
  • 从内核模式(SVC)切回到用户模式,PC寄存器也切回用户现场.
  • 由此完成整个系统调用全过程

七段追踪代码,逐个分析

1.应用程序 main

int main(void)
{
	char mqname[NAMESIZE], msgrv1[BUFFER], msgrv2[BUFFER];
	const char *msgptr1 = "test message1";
	const char *msgptr2 = "test message2 with differnet length";
	mqd_t mqdes;
	int prio1 = 1, prio2 = 2;
	struct timespec ts;
	struct mq_attr attr;
	int unresolved = 0, failure = 0;
	sprintf(mqname, "/" FUNCTION "_" TEST "_%d", getpid());
	attr.mq_msgsize = BUFFER;
	attr.mq_maxmsg = BUFFER;
	mqdes = mq_open(mqname, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值