点击查看系列文章 =》 Interrupt Pipeline系列文章大纲-优快云博客
原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!
5.2 ARM64 Xenomai系统调用
5.2.1 IPIPE区分双核系统调用(复用x8寄存器)
5.2.2 用户层:用latency演示Xenomai系统调用
在《5.1.1 用户层:用hello world演示系统调用》章节中,用最简单的hello world来演示Linux的系统调用。
在本章节,使用Xenomai自带的测试程序latency来演示Xenomai系统调用。它的源码在xenomai-v3.2.1/testsuite/latency/latency.c,编译完成并默认安装到usr/xenomai/bin/latency。
latency 是 Xenomai/Cobalt 实时内核提供的一个工具,用于测量系统的实时性能,特别是上下文切换和中断响应的延迟。它启动后,会新建一个display线程用于打印信息;会新建一个sampling线程用于延迟采样。
使用gdb来观察samping线程的系统调用read。
(1)在shell下启动# gdb latency
(2)执行(gdb) run,在确保开始打印延迟信息时,按Ctrl+C中断latency的执行。用(gdb) info threads可以看到此时有4个线程,其中sampling-727就是用测试测量延迟的线程。并且,sampling-727线程中断的位置是Xenomai系统调用库函数__wrap_read。为什么有__wrap_前缀,请参考:xenomai内核解析--双核系统调用(二)--应用如何区分xenomai/linux系统调用或服务_xenomai libevl-优快云博客
(3)执行(gdb) disassemble显示当前位置的汇编
其中和系统调用号相关的两行汇编摘出来:
mov w8, #0x51 // w8 = 0x0051
mov 指令将立即数 #0x51 (十进制为81)直接移动到32位寄存器 w8 中。这意味着 w8 的低16位会被设置为 0x51,而高16位被清零。
movk w8, #0x1000, lsl #16 // w8 = 0x10000051
movk 指令用于修改寄存器中指定位置的16位字段,而不改变其他位。这里的 lsl #16 表示立即将立即数 #0x1000 左移16位,然后将其放入寄存器 w8 的相应位置。movk 将不会影响已经存在于 w8 中的低16位。
结合两条指令的效果如下:
第一条指令 mov w8, #0x51 设置 w8 的值为 0x0051。
第二条指令 movk w8, #0x1000, lsl #16 修改 w8 的高16位为 0x1000,同时保留低16位的 0x51。
最终结果是 w8 的值变为 0x10000051。
这个结果与《5.2.1 IPIPE区分双核系统调用(复用x8寄存器)》的分析,是完全匹配的。接下来分析,在内核层Xenomai系统调用的流程:《5.2.3 内核层:Xenomai系统调用的流程》。
点击查看系列文章 =》 Interrupt Pipeline系列文章大纲-优快云博客
原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!