5.2.3 内核层:Xenomai系统调用的流程

点击查看系列文章 =》 Interrupt Pipeline系列文章大纲-优快云博客

原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!

5.2.3 内核层:Xenomai系统调用的流程

参考《5.1.2 内核层:ARM64 Linux系统调用的流程》,先回顾一下ARM64 Linux系统调用的过程:

第一步,从el0_sync跳转到el0_svc。

第二步,从el0_svc跳转到c函数el0_svc_handler

第三步,从el0_svc_handler调用el0_svc_common

第四步,el0_svc_common调用invoke_syscall

在第四步的el0_svc_common函数中,IPIPE是在调用invoke_syscall之前,调用ipipe_handle_syscall进行系统调用的劫持。如下图所示。

(1)ipipe_handle_syscall

第1186行,两个判断条件都成立。其中_TIP_HEAD代表当前线程是实时进程。

(2) ipipe_fastcall_hook->handle_head_syscall

函数比较长,分成两张图:

第498行,通过宏__xn_syscall(__regs),对x8寄存器的值执行与用户层相反的操作,即与~0x10000000(0xFFFFFF)进行逻辑与运算,得到原始的系统调用号0x51(81),存到变量code。

第512行,以code为下标,从Xenoami系统调用表cobalt_syscalls中找到系统调用函数指针,赋值给handler。此时handler指向CoBaLt_read

第600行,执行handler即CoBaLt_read,跳转到了由COBALT_SYSCALL定义的Xenomai系统调用read。

至此,走完了Xenomai实时进程调用Xenomai系统调用的过程。

但是这个是最简单的过程!

Xenomai实时线程如果切换到root domain?

或者Xenomai调用了Linux系统调用?

考虑所有因素,可能有如下组合:

Linux系统调用

Xenomai系统调用

Linux线程

仅能运行在Root domain

todo

todo

Xenomai实时线程

运行在Head domain

todo

已分析,最简单

Xenomai实时线程

运行在Root domain

todo

todo

 后面的章节逐步讨论!

点击查看系列文章 =》 Interrupt Pipeline系列文章大纲-优快云博客

原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值