2.4 Xenomai3 内核空间介绍
2.4.1 Cobalt 实时内核启动参数
Cobalt内核接受一组参数,这些参数应该由引导加载程序在内核命令行中传递。
Cobalt支持的参数一直在演变,下表列出了当前支持的参数、说明及默认值。
| 参数名称 | 描述 | 默认值 |
|---|---|---|
xenomai.supported_cpus | 实时CPU掩码。该掩码表示哪些CPU核心允许运行Xenomai的实时任务。 | -1(=所有CPU核心) |
xenomai.allowed_group=<gid> | 只允许指定用户组的进程创建实时任务,其他用户组的进程无法使用 Xenomai 实时服务。是Linux用户组的ID,其成员应被Cobalt核心允许访问。 | 完全开放访问,所有用户组的进程都可以创建实时任务,没有任何组权限限制 |
xenomai.sysheap_size=<kbytes> | 设置Cobalt核心用于分配运行时对象的内部内存堆大小。该值以千字节(kB)为单位表示。 | 4096 kB |
xenomai.state=<state> | 设置Cobalt核心在启动时的初始状态,可以是enabled(启用)、stopped(停止)或disabled(禁用)。有关这些状态的描述,请参阅关于corectl(1)工具的文档。 | enabled(启用) |
xenomai.watchdog_timeout | CONFIG_XENO_OPT_WATCHDOG=y启用看门狗功能,用于检测失控的Cobalt线程。启用后,当实时线程持续运行超过设定时间段且在此期间未与Linux交互时,看门狗将被触发。触发时当前线程会被移出实时域,并立即接收来自Linux内核的SIGDEBUG信号。看门狗的超时时间可通过CONFIG_XENO_OPT_WATCHDOG_TIMEOUT参数设置。 | 4秒 |
xenomai.smi=<state> | x86特有的:设置SMI补救的状态。可能的值有disabled(禁用)、detect(检测)和enabled(启用)。 | detect(检测) |
xenomai.smi_mask=<source-mask> | x86特有的:要在SMI控制寄存器中屏蔽的一组位。 | 1(=全局禁用) |
当内核启动后,可以在/sys/module/xenomai/parameters/中查看和修改 Cobalt 实时内核的启动参数。
/sys/module/xenomai/parameters/
|-- allowed_group
|-- state
|-- supported_cpus
|-- sysheap_size
`-- watchdog_timeout
另外,下述参数已经被删除,不再支持,避免误用。
xenomai.clockfreq=<hz-freq>覆盖用于测量时间间隔的实际时间时钟频率。
commit 758b316321b06070eea627d2766eef5842da480b
Author: Philippe Gerum <rpm@xenomai.org>
Date: Sun Jan 31 15:45:39 2021 +0100
cobalt/init: ipipe: remove clock frequency override
Regarding the frequency of the clock hardware, the kernel knows
better. This parameter dates back to the dark ages when the kernel
might not have detected variations in (per-CPU) clock frequency, which
is no more an issue nowadays.
Actually, we do want to rely on the non-trivial logic the kernel has
to figure out that value dynamically for us.
So let's drop the user override for this parameter.
Signed-off-by: Philippe Gerum <rpm@xenomai.org>
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
xenomai.timerfreq=<hz-freq>覆盖用于编程定时器触发的实际时间定时器频率。
commit 64289ae2d896f07c005881b3a349f4aae6f902be
Author: Philippe Gerum <rpm@xenomai.org>
Date: Sun Jan 31 15:45:38 2021 +0100
cobalt/machine: ipipe: drop timer frequency setting
The only user of the timer frequency setting was the machine-specific
timer calibration handler, which is now gone. Therefore we don't need
to know the timer frequency anymore. As a consequence, we don't care
about overriding its value as determined by the I-pipe either.
Let's drop all of these antiquated bits.
Signed-off-by: Philippe Gerum <rpm@xenomai.org>
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
2.4.2 Cobalt 实时内核状态与统计信息 /proc/xenomai
Xenomai 状态与统计信息可以通过/proc/xenomai目录下的各个子目录和文件获取。
在 Cobalt 实时内核执行 xenomai_init 初始化时,会调用 xnprocfs_init_tree 函数创建 /proc/xenomai 目录。同时,它会创建如下子目录及文件:debug/lock,version,faults,latency。
除了上述默认创建的目录及子目录,Xenomai 各个模块也会根据需要创建自己的子目录及文件。
系统启动之后,/proc/xenomai目录包含如下内容。
/proc/xenomai/
|-- affinity
|-- clock
| `-- coreclk
|-- debug
| |-- lock
| `-- relax
|-- faults
|-- heap
|-- latency
|-- registry
| `-- usage
|-- sched
| |-- acct
| |-- rt
| | `-- threads
| |-- stat
| `-- threads
|-- timer
| `-- coreclk
`-- version
affinity:Cobalt 实时内核的CPU亲和性掩码,每一个 bit 位表示系统中的一个CPU。如果该位为 1,则表示相应的CPU是 Cobalt 实时内核所管理的,并且可用于调度实时应用程序。支持在线查看和修改。clock/coreclk:输出 Xenomai 核心时钟相关的一些配置和状态,包括底层时钟、定时器、Watchdog、延时补偿(Gravity)等。其中,延时补偿(Gravity)支持在线修改。debug:显示 Cobalt 实时内核的调试信息,包括锁的入口、空转时间等信息和次模式切换信息。faults:显示实时上下文中发生的各种不同异常的计数。heap:显示 Cobalt 实时内核中的各种不同堆内存的总量与余量。latency:显示和修改用户态实时任务的延迟补偿(Gravity)值。registry:显示IPC通信对象例如信号量、互斥锁等的信息。sched:显示实时任务调度信息、状态信息等。timer/coreclk:显示 Cobalt 实时内核在每个 CPU 上维护并运行的定时器的相关信息。version:显示当前运行的 Cobalt 实时内核版本。
2.4.3 Cobalt 实时内核导出的 RTDM 设备文件
/dev/rtdm/
|-- analogy0
|-- analogy1
|-- analogy2
|-- analogy3
|-- analogy4
|-- analogy5
|-- analogy6
|-- analogy7
|-- analogy8
|-- analogy9
|-- autotune
|-- gpiopwm0
|-- gpiopwm1
|-- gpiopwm2
|-- gpiopwm3
|-- gpiopwm4
|-- gpiopwm5
|-- gpiopwm6
|-- gpiopwm7
|-- heapcheck
|-- memdev-private
|-- memdev-shared
|-- memdev-sys
|-- switchtest
`-- timerbench
- analogy*:模拟量设备
- gpiopwm*: GIO-based PWM 设备
- autotune:
autotune工具依赖于 /dev/rtdm/autotune 设备。 - heapcheck:
smokey测试框架中的coreheap测试用例依赖/dev/rtdm/heapcheck设备。 - switchtest:
switchtest测试工具依赖/dev/rtdm/switchtest设备。 - timerbench:
latency和altency测试工具依赖/dev/rtdm/timerbench设备。 - memdev-private:Cobalt 实时内核在创建每个实时进程的时候,会为其创建一个内核态的私有堆内存,用于存储实时进程各自的IPC通信对象的状态。且通过 UMM 框架把私有堆内存导出到用户态,支持在用户态直接获取IPC通信对象的状态。
- memdev-shared:Cobalt 实时内核在启动过程中,会申请一个内核态的共享堆内存。Cobalt 实时内核在创建每个实时进程的时候,会在共享堆内存上申请空间,用于存储实时进程的状态信息。通过 UMM 框架把共享堆内存导出到用户态,支持在用户态直接获取实时进程的状态信息。
- memdev-sys:Cobalt 实时内核在启动过程中,为自身申请的系统堆内存。在 Cobalt 实时内核中,调用 xnmalloc/xnfree 申请释放内存,都是基于系统堆内存。
2.4.4 OOB 中断信息
实现中断管道机制的项目,从 ipipe 演进到 dovetail 之后,In-Bnad 和 OOB 中断的信息都被合并到 /proc/interrupts 文件中。
CPU0 CPU1 CPU2 CPU3
9: 2 1 1 1 SIRQC 9 Edge in-band work
12: 3757 3534 3439 3580 GICv3 27 Level oob arch_timer
44: 34 0 0 0 GICv3 78 Edge virtio0
45: 2098 0 0 0 GICv3 79 Edge virtio1
47: 0 0 0 0 GICv3 34 Level rtc-pl031
48: 55 0 0 0 GICv3 33 Level uart-pl011
49: 0 0 0 0 GICv3 23 Level arm-pmu
50: 0 0 0 0 SIRQC 50 Edge Inband sirq
51: 0 0 0 0 SIRQC 51 Edge Inband sirq
52: 0 0 0 0 SIRQC 52 Edge Inband sirq
53: 3598 3393 3280 3437 SIRQC 53 Edge proxy tick
54: 0 0 0 0 9030000.pl061 3 Edge GPIO Key Poweroff
IPI0: 757 999 1342 1482 Rescheduling interrupts
IPI1: 580 413 493 290 Function call interrupts
IPI2: 0 0 0 0 CPU stop interrupts
IPI3: 0 0 0 0 CPU stop (for crash dump) interrupts
IPI4: 0 0 0 0 Timer broadcast interrupts
IPI5: 0 0 0 0 IRQ work interrupts
IPI6: 0 0 0 0 CPU wake-up interrupts
Err: 0
从中断控制器的角度,包括两个中断控制器: GICv3 和 SIRQC。
- GICv3 控制器: 在 ARM 系统中,GICv3 控制器是系统中最重要的中断控制器。它负责管理系统中所有中断源,包括外部中断、异常、软件中断、定时器中断等。
- SIRQC 控制器: SIRQC 控制器是 Cobalt 实时内核中用于模拟中断的虚拟中断控制器。它负责处理软件生成的合成中断(如示例中的 proxy tick 和 in-band work),并将它们交由 Linux 标准中断处理流程处理。
从中断类型的角度,包括两种中断类型:In-Band 和 OOB 中断。
- OOB 中断
12: 3757 3534 3439 3580 GICv3 27 Level oob arch_timer
当一个中断源在注册中断处理程序时指定了 IRQF_OOB 标记,它将被视为 OOB 中断,且其中断处理程序会在 Cobalt 实时内核的上下文中运行。
在 /proc/interrupts 文件中,OOB 中断的名称之前会额外添加 oob 字样。
#ifdef CONFIG_IRQ_PIPELINE
seq_printf(p, " %-3s", irq_settings_is_oob(desc) ? "oob" : "");
#endif
上述 arch_timer 就是一个 OOB 中断,它隶属于 GICv3 控制器,用于处理定时器中断。
in-band workIn-Band 中断
9: 2 1 1 1 SIRQC 9 Edge in-band work
in-band work 隶属于 SIRQC 虚拟中断控制器,它的中断处理程序运行在 Linux 上下文中,可以跨域调度执行工作者队列中的任务。
在 Cobalt 实时内核上下文中,通过 irq_work_queue() 提交任务到工作者队列。当 in-band work 被触发时,其中断处理函数会从工作者队列中取出任务并执行。
Inband sirqIn-Band 中断
50: 0 0 0 0 SIRQC 50 Edge Inband sirq
Inband sirq 隶属于 SIRQC 虚拟中断控制器,常用于在 Linux 上下文中处理特定事件。例如 Cobalt 实时内核的 xnpipe、select 和 registry 模块利用此机制执行各自在 Linux 上下文中的工作。
proxy tickIn-Band 中断
53: 3598 3393 3280 3437 SIRQC 53 Edge proxy tick
proxy tick 隶属于 SIRQC 虚拟中断控制器,用于协调实时(out-of-band)和非实时(in-band)两个阶段的时钟处理。
proxy tick 设备是一种合成时钟事件设备,用于将硬件 tick 设备的控制权移交 Cobalt 实时内核。
当硬件定时器到期时,中断首先在带外阶段被处理,然后综合不同情况来决定是否需要模拟一个带内 tick。如果需要,则会触发一个在带内阶段处理的 proxy tick In-Band 中断。
975

被折叠的 条评论
为什么被折叠?



