Xenomai/IPIPE源代码情景解析
文章平均质量分 91
专注分析Xenomai底层核心Interrupt Pipeline的实现
三问Linux社区
分享过往数年服务器和Linux相关工作经验,关注当下热点技术,紧着未来发展趋势。
欢迎关注 “三问Linux社区” 公众号,探讨技术,共同进步!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
《Xenomai/IPIPE源代码情景解析》
1I-pipe介绍2I-pipe对ARM64异常向量表的改造2.1ARM64中断机制http://t.csdnimg.cn/FwMas2.2ARM64异常处理2.3el0_irq2.4el0_sync2.5el1_irq2.6el0_sync原创 2024-07-30 10:43:20 · 4124 阅读 · 0 评论
-
6.4.3 Xenomai xnthread_relax原理
实时线程有时需要离开head域,转而在root域中执行,主要场景有两个:(1)执行非实时工作:运行涉及由Linux内核处理的常规系统调用的非时间关键(带内)工作。(2)处理CPU异常:从CPU异常中恢复,例如处理主要内存访问故障,对于这类故障,无需关注响应时间,也无需在实时核心中重复处理。原创 2025-03-06 09:31:25 · 1524 阅读 · 1 评论 -
6.4.2 Xenomai xnthread_harden原理
原创不易,需要大家多多鼓励!原创 2025-03-03 08:35:48 · 1572 阅读 · 0 评论 -
6.4.1 Xenomai/Linux线程交替调度的本质
创新性的使用沙漏模型来解释Xenomai/Linux交替调度原创 2025-02-24 10:38:51 · 2284 阅读 · 0 评论 -
6.3.3 Xenomai/Linux进程/多线程描述符之间的关联
主线程和子线程结构体struct cobalt_thread中的struct cobalt_process指针,都指向同一个struct struct cobalt_process。主线程和子线程结构体struct cobalt_thread都会加入到同一个struct struct cobalt_process中的thread_list链表!原创 2025-02-17 10:46:22 · 1669 阅读 · 0 评论 -
6.3.2 Xenomai/Linux进程/主线程描述符之间的关联
Xenomai/Linux进程/主线程描述符之间的关联,且struct cobalt_thread称为struct task_struct的影子。原创 2025-02-13 11:07:44 · 1478 阅读 · 0 评论 -
6.3.1 Xenomai/Linux进程/线程描述符的定义与异同
Xenomai/Linux进程/线程描述符的定义与异同原创 2025-02-12 09:49:57 · 562 阅读 · 0 评论 -
6.2.4 Xenomai3:创建实时线程第三弹之登堂入室sc_cobalt_thread_create
在上一章节《6.2.3 Xenomai3:创建实时线程第二弹之移花接木cobalt_thread_trampoline》中,分析到子线程会调用入口函数cobalt_thread_trampoline,并将 iargs 作为参数传递给该函数。此时,Linux中的子线程task_struct已经初始化完毕,而xenomai中对应的cobalt_thread怎么初始化呢?答案就在第96行的sc_cobalt_thread_create系统调用。原创 2025-02-11 11:13:18 · 1337 阅读 · 0 评论 -
6.2.3 Xenomai3:创建实时线程第二弹之移花接木cobalt_thread_trampoline
__real_pthread_create意味着直接调用pthread库中的pthread_create函数。这里传入的线程入口函数并不是原始入口函数,而被移花接木的改为跳板入口函数cobalt_thread_trampoline!原创 2025-02-11 11:12:32 · 730 阅读 · 0 评论 -
6.2.2 Xenomai3:创建实时线程第一弹之改头换面pthread_create
在hello.c的第56行,原先是直接调用libpthread库的pthread_create函数,但是从堆栈信息来看,反而改头换面,调用了libcobalt库的__wrap_pthread_create函数。这是如何做到的?原创 2025-02-10 09:51:59 · 1131 阅读 · 0 评论 -
6.2.1 Xenomai3: hello world演示线程创建
6.2.1 Xenomai3: hello world演示线程创建主函数中使用POSIX线程(pthread)库的pthread_create来创建一个线程,并在线程函数 helloworld 中,使用 clock_nanosleep 实现精确的周期性任务,每隔1s打印一次"Hello World!"。原创 2025-02-10 09:50:20 · 594 阅读 · 0 评论 -
5.4.6 场景5之Linux线程调用Xenomai系统调用bind
参考《5.2.2 用户层:用latency演示Xenomai系统调用》,latency 是 Xenomai/Cobalt 实时内核提供的一个工具,用于测量系统的实时性能,特别是上下文切换和中断响应的延迟。它启动后,会新建一个display线程用于打印信息;会新建一个sampling线程用于延迟采样。通过条件断点,在ipipe_handle_syscall第1200行处,Linux进程运行在Root domain,调用Xenomai系统调用bind,完成对应的cobalt process的创建。原创 2025-01-22 14:17:34 · 1772 阅读 · 0 评论 -
5.4.5 场景4之运行在root域Xenomai线程调用Linux系统调用read
参考《5.2.2 用户层:用latency演示Xenomai系统调用》,latency 是 Xenomai/Cobalt 实时内核提供的一个工具,用于测量系统的实时性能,特别是上下文切换和中断响应的延迟。它启动后,会新建一个display线程用于打印信息;会新建一个sampling线程用于延迟采样。通过条件断点,在ipipe_handle_syscall第1200行处,抓到Xenomai实时线程运行在root域时,对Linux系统调用read的调用。原创 2025-01-21 09:42:33 · 892 阅读 · 0 评论 -
5.4.4 场景3之运行在root域Xenomai线程调用Xenomai系统调用thread_setname
通过条件断点,在ipipe_handle_syscall第1200行处,抓到Xenomai实时线程运行在root域时,对Xenomai系统调用thread_setmode的调用。原创 2025-01-20 09:37:33 · 1349 阅读 · 0 评论 -
5.4.3 场景2之运行在Head域Xenomai线程调用Linux系统调用getpid
参考《5.2.2用户层:用latency演示Xenomai系统调用》,latency是Xenomai/Cobalt实时内核提供的一个工具,用于测量系统的实时性能,特别是上下文切换和中断响应的延迟。它启动后,会新建一个display线程用于打印信息;会新建一个sampling线程用于延迟采样。通过条件断点,在ipipe_handle_syscall第1200行处,抓到Xenomai实时线程运行在head域时,对Linux系统调用getpid的调用。原创 2025-01-17 11:03:06 · 1645 阅读 · 0 评论 -
5.4.2 场景1之运行在Head域Xenomai线程调用Xenomai系统调用read
latency 是 Xenomai/Cobalt 实时内核提供的一个工具,用于测量系统的实时性能,特别是上下文切换和中断响应的延迟。它启动后,会新建一个display线程用于打印信息;会新建一个sampling线程用于延迟采样。本文分析samping作为Xenomai实时线程,调用Xenomai系统调用read的过程。原创 2025-01-16 09:47:09 · 1716 阅读 · 0 评论 -
5.4.1 IPIPE劫持系统调用的流程与场景
本文总结:ipipe_handle_syscall劫持系统调用后,需要处理6中场景,分为3个代码路径进行处理:快速、慢速和正常路径!原创 2025-01-06 14:17:20 · 1983 阅读 · 0 评论 -
5.3.5 ipipe_flags之TIP_USERINTRET
第5步,调用enable_step_ts,检查TSK_TI_FLAGS中是否设置了TIF_SINGLESTEP标记。关闭TIP_USERINTRET的过程:__ipipe_notify_user_intreturn->__ipipe_notify_kevent-> ipipe_kevent_hook -> handle_user_return->ipipe_disable_user_intret_notifier()第6步,检查TSK_TI_IPIPE中是否设置了_TIP_USERINTRET标记。原创 2025-01-04 09:20:36 · 1306 阅读 · 0 评论 -
5.3.4 ipipe_flags之TIP_MAYDAY
小结:TIP_MAYDAY定义了一种紧急情况,依赖TIP_NOTIFY中的trap机制,在不同的场景下,最终将实时线程切换到Linux中运行。原创 2025-01-03 11:15:13 · 1172 阅读 · 0 评论 -
5.3.3 ipipe_flags之TIP_NOTIFY
ipipe_flags之TIP_NOTIFY(1)Xenomai线程必有TIP_NOTIFY标记(2)TIP_NOTIFY分3类syscall/trap/kevent(3)TIP_NOTIFY需要hook钩子函数来响应原创 2025-01-02 11:24:21 · 1600 阅读 · 0 评论 -
5.3 IPIPE: Xenomai/Linux双核交互之ipipe_flags
struct task_struct 中包含了struct thread_info结构体(CONFIG_THREAD_INFO_IN_TASK=y,否则struct thread_info在内核栈的栈底)。如下图,ipipe_flags不同的位可以代表不同的含义,例如TIP_MAYDAY、TIP_NOTIFY、TIP_HEAD。当从root域迁移到head域,利用ipipe_set_ti_thread_flag设置TIP_HEAD;TIP_HEAD最简单,最好理解,代表进程当前运行在Head域。原创 2025-01-01 15:49:23 · 2215 阅读 · 0 评论 -
5.3.4 Xenomai3: hello world如何变成Xenomai实时进程
Xenomai3 利用GCC的 __attribute__((constructor)) 特性来定义了3种优先级的构造函数,按优先级执行,完成了Xenomai相关服务的初始化,把Linux进程转换程序Xenomai进程。原创 2024-12-31 14:45:10 · 2773 阅读 · 0 评论 -
5.3.3 Xenomai3: hello world演示应用编译与启动
从shell启动hello world,那么hello world会变成实时进程吗?原创 2024-12-30 10:26:43 · 1623 阅读 · 0 评论 -
The Interrupt Pipeline (aka I-pipe)
IPIPE最原汁原味的英文原文介绍转载 2024-12-21 21:45:26 · 177 阅读 · 0 评论 -
5.3.2 Xenomai3:使用xeno-config获取编译和链接参数
xeno-config是一个辅助脚本,用于为使用Xenomai库的应用程序提供正确的编译和链接标志。通过这个工具,开发者可以轻松获取所需的编译器选项和链接器参数,确保应用程序能够正确地集成到Xenomai环境中。原创 2024-12-20 11:44:28 · 1446 阅读 · 0 评论 -
5.3.1 Xenomai3:libcobalt库和API/Skin分析
Xenomai3:libcobalt库和API/Skin分析。根据官方框架图来分析,趣读颜色和文字。原创 2024-12-20 11:25:30 · 2070 阅读 · 1 评论 -
5.2.3 内核层:Xenomai系统调用的流程
第498行,通过宏__xn_syscall(__regs),对x8寄存器的值执行与用户层相反的操作,即与~0x10000000(0xFFFFFF)进行逻辑与运算,得到。第512行,以code为下标,从Xenoami系统调用表cobalt_syscalls中找到系统调用函数指针,赋值给handler。第600行,执行handler即CoBaLt_read,跳转到了由COBALT_SYSCALL定义的Xenomai系统调用read。第三步,从el0_svc_handler调用el0_svc_common。原创 2024-12-16 09:44:22 · 1263 阅读 · 0 评论 -
5.2.2 用户层:用latency演示Xenomai系统调用
在本章节,使用Xenomai自带的测试程序latency来演示Xenomai系统调用。原创 2024-12-12 11:19:48 · 2822 阅读 · 0 评论 -
5.1.3 内核层:ARM64 Linux系统调用的定义
ARM64 Linux系统调用的定义:__arm64_sys_write是如何定义的?又是如何插入sys_call_table的呢?原创 2024-12-10 09:43:14 · 1724 阅读 · 0 评论 -
5.1.2 内核层:ARM64 Linux系统调用的流程
本文以系统调用write为例,追踪系统调用发生的顺序,找到系统调用表sys_call_table中的__arm64_sys_write。__arm64_sys_write是如何定义的?又是如何插入sys_call_table的呢?通过解答上述两个问题,彻底搞清楚了arm64系统调用的原理。原创 2024-12-09 10:05:42 · 2006 阅读 · 0 评论 -
5.1.1 用户层:用hello world演示系统调用
用hello world演示系统调用原创 2024-12-09 09:50:22 · 1307 阅读 · 0 评论 -
4.8 IPIPE中断流动的标识
__ipipe_dispatch_irq使用的flags和Interrupt control bits原创 2024-11-25 10:34:49 · 1344 阅读 · 0 评论 -
4.7.1 Linux chained中断处理流程
想要完成chained中断的处理,需要多次嵌套调用generic_handle_irq,每次都传入正确的virq。原创 2024-11-21 16:28:53 · 1335 阅读 · 0 评论 -
4.6 仅在root domain注册的设备中断
对比《4.5 只在head domain注册的设备中断》和《4.6 仅在root domain注册的设备中断》,同样一个硬件设备,应该只在Head domain或root domain加载一个驱动。除了设备中断不会从Xenomai流到Linux之外,还需要防止两个驱动对寄存器的操作发生冲突。参考《4.4 timer中断从Xenomai流向Linux》,timer设备是一个特例,而且打完了IPIPE Patch后,Linux本身不再直接操作timer硬件。原创 2024-11-18 18:41:52 · 1339 阅读 · 0 评论 -
4.5 只在head domain注册的设备中断处理流程
在xnintr_irq_handler执行的过程中,先是执行intr->isr即macb_interrupt,然后根据返回值,判断是否要传递中断到root domain。只有当返回值为XN_IRQ_PROPAGATE时,才会传递中断到root domain。上面已经提到了,macb_interrupt的返回值是XN_IRQ_HANDLED,所有第668行不会执行,会走到第670行,结束中断。在xnintr_init的注释中,明确写道:强烈不建议使用XN_IRQ_PROPAGATE原创 2024-11-17 22:44:24 · 1262 阅读 · 0 评论 -
4.4.5 timer中断流向Linux(从interrupt log回放)
timer中断是一个特殊的中断,必须在head domain/Xenomai和root domain/Linux中执行,所以中断发生后,会经过一个巧妙和复杂的过程,完成中断的流动。原创 2024-11-16 18:02:47 · 1215 阅读 · 0 评论 -
4.4.4 timer中断流向root domain(记录到interrupt log)
timer中断在head domain中的中断处理程序xnintr_core_clock_handler,在不同的时机,会把timer中断号3记录到root domain的interrupt log。原创 2024-11-16 17:36:50 · 1279 阅读 · 0 评论 -
4.4.3 timer中断流向Xenomai(__ipipe_dispatch_irq下半部)
第1554行,调用dispatch_irq_head函数。此函数的入参为virq 3,等同于Head domain的XIRQ 3,以3为数组下标,执行head domain已经注册的中断处理程序head->irqs[3].handler即xnintr_core_clock_handler。原创 2024-11-15 22:28:41 · 1342 阅读 · 0 评论 -
4.4.2 timer中断的应答(__ipipe_dispatch_irq上半部)
IPIPE引入了ack和end的概念,在irq_desc和ipipe_irqdesc中都定义了ack函数,默认情况下,irq_desc->ipipe_ack、root域和head域的ipipe_irqdesc->ackfn都是相同的,但是ipipe_irqdesc->ackfn又可以通过ipipe_request_irq单独指定。在__ipipe_dispatch_irq中,无论中断没有在head域注册中断处理程序,则会调用root域ipd->irqs[irq].ackfn,对中断控制器进行响应。原创 2024-11-15 22:25:35 · 1342 阅读 · 0 评论 -
4.4.1 timer中断的3个逻辑中断号
timer中断ARCH_TIMER_VIRT_PPI(hwirq 27)对应的3个逻辑中断号:Linux virq: 3Head domain XIRQ: 3Root domain XIRQ: 3对应上述3个逻辑中断号,分别注册了三个中断处理程序原创 2024-11-08 16:13:13 · 1256 阅读 · 0 评论
分享