完结感言:
历时7个月,共76篇,终于完结!牺牲了几乎所有业余和娱乐时间,数次想要放弃,庆幸自己坚持下来了。
从技术角度,即深入理解了Xenomai的设计与实现,同时刷新并加深了自己对Linux内核的认知,算是一举两得。
意外惊喜,以文会友,认识了一些新朋友,特别是找到了志同道合的好朋友。在探索Xenomai的路上,期待与朋友们一起交流,共同进步!
《Xenomai/IPIPE源代码情景解析》
1 I-pipe介绍
1.1 I-pipe与Xenomai
1.2 I-pipe基本概念 英文:The Interrupt Pipeline (aka I-pipe)
1.3 拉取I-pipe代码
2 I-pipe对ARM64异常向量表的改造
2.1 ARM64中断机制
2.2 ARM64异常处理
2.3 el0_irq
2.3.1 el0_irq代码框架
2.3.2 kernel_entry 0 与kernel_exit 0
2.3.3 el0_irq_naked与enable_da_f
2.3.4 trace_hardirqs_off与trace_hardirqs_on
2.3.5 irq_handler
2.3.6 返回用户空间
2.4 el0_sync
2.5 el1_irq
2.5.1 el1_irq代码框架
2.5.2 kernel_entry 1与kernel_exit 1
2.5.3 irq_handler返回值
2.5.4 对CONFIG_PREEMPT的处理
2.6 el1_sync(无代码变化)
3 I-pipe启动过程
3.1 I-pipe四行启动代码
3.2 内核初始化(盘古开天地)
3.2.1 内核初始化的神话
3.2.2 从头 (Head)开始
3.2.3 从头初始化到身体
3.2.4 宇之内存的空分复用
3.2.5 宙之CPU的时分复用
3.2.6 盘古开天地start_kernel
3.3 第一行之hard_local_irq_disable()
3.3.1 Linux中断的使能与屏蔽
3.3.1.1 中断使能与屏蔽的三重关卡
3.3.1.2 第一重关卡IMR
3.3.1.3 第二重关卡中断控制器的使能bit
3.3.1.4 第三重关卡CPU core异常掩码标志
3.3.2 IPIPE对Linux中断使能与屏蔽的改造
3.3.2.1 第一重关卡IMR的改造
3.3.2.2 第二重关卡中断控制器的使能bit的改造
3.3.2.3 第三重关卡的改造
3.4 第二行之__ipipe_init_early()
3.4.1 IPIPE数据结构
3.4.1.1 IPIPE基本数据结构
3.4.1.2 IPIPE对Linux中断号的改造
3.4.1.3 IPIPE interrupt log数据结构
3.4.2 __ipipe_init_early之fixup_percpu_data()
3.4.3 __ipipe_init_early之初始化root domain
3.4.4 __ipipe_init_early之再论虚拟中断
3.5 第三行之__ipipe_init()
3.5.1 __ipipe_init()之IPIPE_CRITICAL_IPI
3.5.2 __ipipe_init()之完成中断处理程序设置
3.6 第四行之__ipipe_init_proc()
4 中断从Xenomai流向Linux
4.1 Xenomai如何初始化
4.2 物理中断号如何转换成Linux中断号
4.2.1 通过DTS传递物理中断号给Linux
4.2.2 Linux解析DTS/DTB流程
4.2.3 根据DTS完成中断控制器初始化
4.2.4 根据DTS完成timer初始化
4.2.5 根据DTS完成platform设备创建
4.3 Linux的中断处理流程
4.4 timer中断从Xenomai流向Linux
4.4.1 timer中断的3个逻辑中断号
4.4.2 timer中断的应答(__ipipe_dispatch_irq上半部)
4.4.2.1 timer中断的应答之ipipe_end
4.4.3 timer中断流向Xenomai(__ipipe_dispatch_irq下半部)
4.4.4 timer中断流向root domain(记录到interrupt log)
4.4.5 timer中断流向Linux(从interrupt log回放)
4.5 只在head domain注册的设备中断处理流程
4.6 仅在root domain注册的设备中断
4.7 chained中断如何流动
4.7.1 Linux chained中断处理流程
4.7.2 IPIPE chained中断处理流程
4.8 IPIPE中断流动的标识
5 双核系统调用
5.1. ARM64 Linux系统调用
5.1.1 用户层:用hello world演示系统调用
5.1.2 内核层:ARM64 Linux系统调用的流程
5.1.3 内核层:ARM64 Linux系统调用的定义
5.2 ARM64 Xenomai系统调用
5.2.1 IPIPE区分双核系统调用(复用x8寄存器)
5.2.2 用户层:用latency演示Xenomai系统调用
5.2.3 内核层:Xenomai系统调用的流程
5.2.4 内核层:Xenomai系统调用的定义
5.3 IPIPE: Xenomai/Linux双核交互之ipipe_flags
5.3.1 IPIPE改造struct thread_info之ipipe_flags
5.3.2 ipipe_flags之TIP_HEAD
5.3.3 ipipe_flags之TIP_NOTIFY
5.3.4 ipipe_flags之TIP_MAYDAY
5.3.5 ipipe_flags之TIP_USERINTRET
5.4 IPIPE: Xenomai/Linux双核系统调用
5.4.1 IPIPE劫持系统调用的流程与场景
5.4.2 场景1之运行在Head域Xenomai线程调用Xenomai系统调用read
5.4.3 场景2之运行在Head域Xenomai线程调用Linux系统调用getpid
5.4.4 场景3之运行在root域Xenomai线程调用Xenomai系统调用thread_setname
5.4.5 场景4之运行在root域Xenomai线程调用Linux系统调用read
6 双核进程调度
6.1 Xenomai进程的创建流程
6.1.1 Xenomai3:libcobalt库和API/Skin分析
6.1.2 Xenomai3:使用xeno-config获取编译和链接参数
6.1.3 Xenomai3: hello world演示应用编译与启动
6.1.4 Xenomai3: hello world如何变成Xenomai实时进程
6.2 Xenomai线程的创建流程
6.2.1 Xenomai3: hello world演示线程创建
6.2.2 Xenomai3:创建实时线程第一弹之改头换面pthread_create
6.2.3 Xenomai3:创建实时线程第二弹之移花接木cobalt_thread_trampoline
6.2.4 Xenomai3:创建实时线程第三弹之登堂入室sc_cobalt_thread_create
6.3 IPIPE: Xenomai/Linux双核交替调度数据结构
6.3.1 Xenomai/Linux进程/线程描述符的定义与异同
6.3.2 Xenomai/Linux进程/主线程描述符之间的关联
6.3.3 Xenomai/Linux进程/多线程描述符之间的关联
6.4 IPIPE: Xenomai/Linux双核交替调度
6.4.1 Xenomai/Linux线程交替调度的本质
6.4.2 Xenomai xnthread_harden原理
6.4.3 Xenomai xnthread_relax原理
点击查看《Xenomai/IPIPE源代码情景解析》
原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力!