鸿蒙开源源码,基于鸿蒙系统开源项目OpenHarmony源码静态分析

本文深入分析了鸿蒙系统OpenHarmony的源码,特别是针对ARM Cortex A7架构下,系统调用的实现方式。通过静态分析,解释了系统调用号如何存储在r7寄存器,参数存放在r0、r1、r2,返回值在r0中的过程。此外,详细介绍了从用户模式通过SVC指令进入内核态的流程,包括中断向量表、异常处理函数 `_osExceptSwiHdl` 和 `OsArmA32SyscallHandle` 函数的作用。文章还展示了如何从系统调用号查找并执行相应的处理函数。最后,以`SysWrite`系统调用为例,揭示了从用户态write调用到内核态write函数的转换,并涉及到NuttX的VFS层和lwip协议栈的交互。
摘要由CSDN通过智能技术生成

#ifndef __scc

#define __scc(X) ((long) (X)) // 转为long类型

typedef long syscall_arg_t;

#endif

#define __syscall1(n,a) __syscall1(n,__scc(a))

#define __syscall2(n,a,b) __syscall2(n,__scc(a),__scc(b))

#define __syscall3(n,a,b,c) __syscall3(n,__scc(a),__scc(b),__scc(c)) //

继续搜索发现有多出匹配,我们关注arch/arm目录下的文件,因为ARM Cortext A7是Armv7-A指令集的32位CPU(如果是Armv8-A指令集的64位CPU则对应arch/aarch64下的文件):

static inline long __syscall3(long n, long a, long b, long c)

{

register long r7 __ASM____R7__ = n;

register long r0 __asm__("r0") = a;

register long r1 __asm__("r1") = b;

register long r2 __asm__("r2") = c;

__asm_syscall(R7_OPERAND, "0"(r0), "r"(r1), "r"(r2));

}

这段代码中还有三个宏,__ASM____R7__、__asm_syscall和R7_OPERAND:

#ifdef __thumb__

#define __ASM____R7__

#define __asm_syscall(...) do { \

__asm__ __volatile__ ( "mov %1,r7 ; mov r7,%2 ; svc 0 ; mov r7,%1" \

: "=r"(r0), "=&r"((int){0}) : __VA_ARGS__ : "memory"); \

return r0; \

} while (0)

#else // __thumb__

#define __ASM____R7__ __asm__("r7")

#define __asm_syscall(...) do { \

__asm__ __volatile__ ( "svc 0" \

: "=r"(r0) : __VA_ARGS__ : "memory"); \

return r0; \

} while (0)

#endif // __thumb__

#ifdef __thumb2__

#define R7_OPERAND "rI"(r7)

#else

#define R7_OPERAND "r"(r7)

#endif

它们有两个实现版,分别对应于编译器THUMB选项的开启和关闭。这两种选项条件下的代码流程基本一致,以下仅以未开启THUMB选项为例进行分析。这两个宏展开后的__syscall3函数内容为:

static inline long __syscall3(long n, long a, long b, long c)

{

register long r7 __asm__("r7") = n; // 系统调用号

register long r0 __asm__("r0") = a; // 参数0

register long r1 __asm__("r1") = b; // 参数1

register long r2 __asm__("r2") = c; // 参数2

do { \

__asm__ __volatile__ ( "svc 0" \

: "=r"(r0) : "r"(r7), "0"(r0), "r"(r1), "r"(r2) : "memory"); \

return r0; \

} while (0);

}

这里最后的一个内嵌汇编比较复杂,它符合如下格式(具体细节可以查阅gcc内嵌汇编文档的扩展汇编说明):

asm asm-qualifiers ( AssemblerTemplate

: OutputOperands

[ : I

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值