5.2.2 用户层:用latency演示Xenomai系统调用

点击查看系列文章 =》 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系列文章大纲-优快云博客

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值