点击查看系列文章 =》 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系列文章大纲-优快云博客
原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!