竹笋

注册

 

发新话题 回复该主题

图解系统调用全貌,这回算是彻底搞明 [复制链接]

1#

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

过程解读

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

1.应用程序main

2.mq_open发起系统调用

解读

SYS_mq_open是真正的系统调用函数,对应一个系统调用号__NR_mq_open,通过宏SYSCALL_HAND_DEF将SysMqOpen注册到g_syscallHandle中.

g_syscallNArgs为注册函数的参数个数,也会一块记录下来.四个参数为SYS_mq_open的四个参数,将保存在R0~R3寄存器中3.syscall

解读

可变参数实现所有系统调用的参数的管理,可以看出,在鸿蒙内核中系统调用的参数最多不能大于6个R7寄存器保存了系统调用号,R0~R5保存具体每个参数可变参数的具体实现后续有其余篇幅详细介绍,敬请

分享 转发
TOP
发新话题 回复该主题