- 博客(203)
- 收藏
- 关注
原创 如何将 `dmesg` 内核日志中的启动时间转换为可读日期?
本文介绍了如何将Linux系统中dmesg命令输出的内核日志时间戳转换为可读的真实日期时间。传统dmesg输出的是系统启动后的秒数,难以直接判断具体发生时间。文章推荐使用systemd配套的journalctl -k命令,它能自动转换时间戳并支持持久化存储、结构化日志和强大过滤功能。详细讲解了journalctl -k的用法,包括时间范围过滤、日志级别筛选、查看历史启动记录等实用技巧,最后通过对比表说明其优于dmesg的特性,建议在systemd环境下优先使用。
2025-10-21 14:50:57
811
原创 D状态和S状态的区别在于对singal的处理
摘要 Linux进程的D状态(不可中断等待)和S状态(可中断睡眠)主要区别在于对信号的处理: D状态:进程因I/O操作(如磁盘读写)阻塞,期间不响应任何信号,确保数据完整性。 S状态:进程可被信号(如SIGKILL)中断,适用于非硬件依赖的等待(如用户输入)。 信号检查的关键时机包括: 内核态返回用户态时(如系统调用结束); 进程唤醒时(从睡眠状态恢复); 中断处理完成后; 显式检查信号(如可中断睡眠期间)。 内核通过异步信号机制确保及时响应事件,同时平衡性能与可靠性。
2025-10-21 14:49:16
920
原创 如何查询交叉编译环境的 glibc 版本
要查询交叉编译环境的glibc版本,可以通过检查目标系统的库文件来实现。首先定位工具链中的库路径(如/usr/aarch64-linux-gnu/lib/),然后使用strings命令提取libc.so.6文件中的版本信息,并用grep过滤出GLIBC_开头的版本号,其中最高版本即为当前glibc版本。若找不到文件,可尝试搜索或检查工具链的sysroot目录。该方法简单高效,适用于验证交叉编译环境的兼容性。
2025-10-19 10:22:08
418
原创 6.4_IPIPE双内核交替调度
本文分析了Xenomai/Linux双核系统的交替调度机制。通过瓷碗模型和沙漏模型对比了Linux与Xenomai的进程状态管理:Linux使用TASK_RUNNING统一表示就绪/运行态,而Xenomai通过XNREADY等状态区分。重点阐述了xnthread_harden和xnthread_relax实现的核心机制,包括pipeline_leave_inband触发任务迁移、__schedule完成上下文切换等关键步骤,揭示了Xenomai如何通过IPIPE在Linux内核中实现硬实时调度的基本原理。
2025-10-15 13:47:53
977
原创 6.3_IPIPE双内核交替调度数据结构
本文分析了Xenomai/Linux双核系统中进程与线程描述符的创建与关联机制。Linux使用task_struct同时描述进程和线程,而Xenomai则分别定义了cobalt_process和xnthread结构体。文章详细阐述了从Shell启动应用的进程创建流程,重点解析了Xenomai通过构造函数和系统调用建立cobalt_process和xnthread的过程,以及它们与Linux task_struct的关联方式。
2025-10-15 13:46:47
658
原创 6.2_Xenomai线程的创建流程
本文介绍了Xenomai3实时线程的创建流程。通过一个hello world示例程序,演示了如何使用pthread_create创建周期性打印"Hello World!"的实时线程。编译时使用Xenomai的posix skin,通过特殊链接参数将标准pthread函数替换为Xenomai的实时版本。调试分析表明,实际调用的是Xenomai封装的__wrap_pthread_create函数而非标准pthread库,从而实现了从普通线程到实时线程的转换。
2025-10-14 10:45:13
798
原创 6.1_Xenomai进程的创建流程
本文分析了Xenomai3的架构和进程创建流程。Xenomai3由内核层的Cobalt core和用户层的libcobalt库组成,通过系统调用实现通信。libcobalt提供了POSIX子集接口(posix skin)和扩展功能,并通过copperplate接口层支持多种非POSIX实时API(如alchemy、vxworks等)。文章详细介绍了使用xeno-config工具获取不同skin(cobalt/posix)的编译和链接参数的方法,重点比较了二者的差异,特别是链接参数中cobalt.wrappe
2025-10-14 10:06:44
1388
原创 5.4_IPIPE双内核系统调用
本文分析了Xenomai双内核架构中IPIPE模块对系统调用的劫持机制。IPIPE在ARM64架构下通过修改el0_svc_common函数,在调用invoke_syscall前插入ipipe_handle_syscall进行系统调用拦截。该机制需要处理6种场景,分为快速路径(ipipe_fastcall_hook)、慢速路径(__ipipe_notify_syscall)和正常路径三种处理方式。重点分析了"运行在Head域的Xenomai线程调用Xenomai系统调用"的场景,详细追踪
2025-09-29 09:45:05
942
原创 5.3_IPIPE双内核交互之ipipe_flags
本文介绍了Xenomai/Linux双内核交互中IPIPE机制的关键数据结构ipipe_flags。ipipe_flags位于内核线程描述符thread_info中,用于标记线程状态和配置,包括TIP_HEAD(运行在Head域)、TIP_NOTIFY(通知机制)等标志位。TIP_NOTIFY分为syscall、trap和kevent三类,通过ipipe_set_hooks设置不同域(root/head)的响应方式。该机制在Xenomai线程创建时自动启用,是双内核实时调度的核心基础设施。
2025-09-29 09:44:37
619
原创 解决Ubuntu使用pip3安装rosdepc时的“externally-managed-environment”错误
摘要 在新版Ubuntu系统中使用pip3 install rosdepc时出现的"externally-managed-environment"错误是系统保护机制所致,防止Python环境被破坏。解决方法包括:1)安装pipx工具;2)配置环境变量;3)通过pipx安装rosdepc。这种方法既能满足安装需求,又能避免系统环境冲突。关键步骤为:sudo apt install pipx→pipx ensurepath→pipx install rosdepc。(149字)
2025-09-24 13:34:10
467
原创 5.2_ARM64_Xenomai系统调用
ARM64 Xenomai系统调用机制分析 本文详细分析了ARM64架构下Xenomai实时系统的系统调用机制。通过复用x8寄存器的高位标志位(0x10000000),Xenomai实现了与Linux系统调用的兼容区分。用户层通过libcobalt库将Xenomai系统调用号与0x10000000进行或运算后存入x8寄存器,内核层则通过反向操作提取原始系统调用号。文章以latency测试程序为例,展示了从用户空间触发Xenomai系统调用(如read)到内核空间处理的全过程,包括寄存器操作、系统调用表查询及
2025-09-23 09:40:59
802
原创 5.1_ARM64_Linux系统调用
本文通过分析ARM64架构下Linux系统调用的实现机制,从用户层printf调用到内核处理流程进行了详细阐述。文章首先以hello world程序为例,使用strace和gdb工具追踪系统调用过程,展示了用户层如何通过SVC指令触发系统调用。随后深入内核层面,解析了从el0_sync异常处理到最终调用系统调用函数的分层处理流程,重点分析了系统调用表初始化机制和核心函数调用关系。通过write系统调用的实例,详细说明了SYSCALL_DEFINE宏定义和系统调用包装函数的生成机制,以及如何将系统调用函数插入
2025-09-23 09:40:09
1208
原创 4.8_中断流动的标识及场景总结
本文分析了IPIPE中断处理机制中的关键标识位控制逻辑。主要讨论了三种传入__ipipe_dispatch_irq的flags参数场景(0、IPIPE_IRQF_NOACK、IPIPE_IRQF_NOSYNC)及其应用条件,详细解析了中断控制位(IPIPE_HANDLE_MASK、IPIPE_STICKY_MASK、IPIPE_LOCK_MASK)的功能实现。其中,IPIPE_HANDLE_MASK表示handler注册状态,IPIPE_STICKY_MASK用于立即处理特定中断(如IPIPE_CRITIC
2025-09-22 09:10:15
1015
原创 4.7_chained中断如何流动
本文分析了Linux和Xenomai/IPIPE处理chained中断的流程差异。当存在多级中断控制器级联时,Linux通过多次嵌套调用generic_handle_irq处理中断,而IPIPE改造为多次调用__ipipe_dispatch_irq以降低延迟。关键点在于IPIPE将chained中断的desc->handle_irq设置为__ipipe_chained_irq标记,并在ackfn中执行原始中断处理函数。处理流程中,IPIPE通过flags=IPIPE_IRQF_NOSYNC避免不必要的
2025-09-22 09:09:47
703
原创 解决 `sudo rosdepc init` 报错:`command not found` 的完整指南
本文分析了Ubuntu系统中sudo rosdepc init报错"command not found"的原因:pipx安装的rosdepc位于用户目录(~/.local/bin),而sudo命令会切换至root环境导致路径失效。提供了直接使用完整路径执行的解决方案:首先通过which rosdepc查找路径,然后以sudo /home/用户名/.local/bin/rosdepc init方式运行。最后介绍了验证安装的方法,包括检查版本和确认初始化生成的文件。该方案无需修改系统配置,简
2025-09-20 15:47:08
329
原创 4.6_仅在rootdomain注册的设备中断
本文对比分析了只在root domain注册设备中断的处理流程,以macb网口驱动为例。当设备中断触发时,IPIPE将其记录到root domain的interrupt log中,通过__ipipe_sync_stage回放后调用__ipipe_do_IRQ,最终回归Linux中断处理流程执行注册的中断处理程序macb_interrupt。与只在head domain注册的中断不同,root domain注册的中断仍会流向Linux,但需要避免同时加载两个驱动导致的寄存器冲突。timer设备是个特例,打了I
2025-09-18 13:35:50
757
原创 4.5_仅在headdomain注册的设备中断
Xenomai 3中的RTDM设备驱动(如CAN、SPI等)通过rtdm_irq_request注册中断时,会在head domain中处理中断而不传递到root domain。这些驱动使用xnintr_irq_handler作为统一的中断处理程序,内部调用驱动特定的ISR(如macb_interrupt)。只有当ISR返回XN_IRQ_PROPAGATE时才会传递中断到Linux,但官方文档强烈不建议这种做法。这种机制使得实时设备的中断处理完全在实时域完成,避免了非实时域的影响。
2025-09-18 13:34:53
722
原创 4.3_Linux的中断处理流程
Linux中断处理流程主要分为四个步骤:1)硬件中断号(hwirq)转换为虚拟中断号(virq),通过GIC中断控制器获取hwirq,再通过irq_domain完成映射;2)通过virq查找对应的中断描述符irq_desc,使用基数树进行快速查找;3)执行中断流控处理程序,针对不同类型中断(如电平触发、边沿触发)调用不同的标准处理函数;4)遍历action链表执行注册的中断处理函数,并根据返回值决定是否唤醒中断线程。整个过程涉及中断控制器初始化、数据结构映射和分层处理机制,确保中断高效可靠地执行。
2025-09-15 07:30:00
1515
原创 4.4_timer中断从Xenomai流向Linux
Xenomai定时器中断处理流程分析 本文分析了Xenomai实时系统下定时器中断从Xenomai流向Linux的处理过程。关键点包括: 定时器中断具有三个逻辑中断号:Linux虚拟中断号(virq 3)、Head域XIRQ 3和Root域XIRQ 3,分别对应不同的中断处理程序。 三个中断处理程序的注册: Linux virq 3:注册arch_timer_handler_virt Root域XIRQ 3:注册__ipipe_do_IRQ Head域XIRQ 3:注册xnintr_core_clock_h
2025-09-15 07:30:00
1013
原创 如何理解 RCU宽限期Grace period
摘要: RCU(读-复制-更新)是Linux内核的高效同步机制,其核心是通过**Grace Period(宽限期)**实现无锁读操作。宽限期定义为从写操作更新指针到所有CPU均进入静默状态(如上下文切换、空闲)的时间段,确保旧数据不再被引用。写操作需等待宽限期结束后才能释放旧内存,避免Use-After-Free风险。Linux内核通过Tree RCU跟踪宽限期,由后台线程检测CPU静默状态。其机制类似图书馆换书:管理员需等待所有读者离开后才销毁旧书。宽限期具有非实时性、可重叠和CPU敏感等特点,是RCU无
2025-09-11 07:30:00
478
原创 AMD EPYC CPU Chiplet技术实践深度分析
AMD EPYC处理器采用创新的Chiplet架构设计,将计算核心(CCD)与I/O模块(IOD)分离,通过5nm和6nm工艺协同优化性能和成本。第四代EPYC Genoa最多集成12个CCD(96核)和1个IOD,支持DDR5内存和PCIe 5.0,带宽达460GB/s。3D V-Cache技术将L3缓存扩展至1.152GB,性能提升25%。Infinity Fabric互连技术升级至GMI3,带宽翻倍至36Gbps,并支持灵活的多路配置。该架构通过模块化设计、先进封装和互连优化,实现了高性能、高能效和成
2025-09-11 07:30:00
999
原创 4.2_物理中断号如何转换成Linux中断号
本文分析了Linux内核如何将物理中断号转换为Linux中断号的过程。首先介绍了GIC V3支持的INTID范围,包括SGI、PPI、SPI和LPI四种中断类型。然后以timer设备为例,详细说明了硬件中断号如何通过设备树(DTS)传递给Linux内核,包括中断属性的解析和转换逻辑。 文章进一步分析了Linux内核解析DTS/DTB的流程,分为发现和展开两个阶段:在发现阶段,内核通过X0寄存器获取DTB物理地址并转换为虚拟地址;在展开阶段,内核将DTB展开为以device_node结构体表示的树形结构。最后
2025-09-10 09:41:59
1747
原创 4.1_Xenomai如何初始化
本文分析了Xenomai实时内核的初始化过程,重点探讨了其与IPIPE交互的关键部分。Xenomai通过xenomai_init函数完成初始化,主要包括两个核心环节:首先调用ipipe_register_head注册"Xenomai"作为head domain,并初始化相关中断处理机制;其次为virtual interrupt 1036注册__xnsched_run_handler处理函数。文章还通过/proc/ipipe/Xenomai的输出验证了分析结果,确认了中断编号1031、10
2025-09-10 09:40:38
551
原创 解决虚拟机中OpenCV无法打开摄像头的问题
在机器人开发或计算机视觉项目中,我们经常需要使用OpenCV的来调用摄像头。然而,当你在虚拟机中进行开发时,可能会遇到无法打开摄像头的问题。本文将介绍如何解决这个问题。
2025-09-09 15:28:03
310
原创 3.6_第四行之__ipipe_init_proc()
摘要:文章分析了Linux内核中__ipipe_init_proc()函数的调用流程及功能。该函数通过start_kernel层层调用,主要负责创建/proc/ipipe目录及其三个子项:version(显示版本号)、Linux(展示root domain中断信息)、tracer(调试目录)。其中,/proc/ipipe/Linux的读取会触发特定调用链显示中断信息。文章还预告了后续将探讨head domain初始化及中断流动机制的内容。(149字)
2025-09-09 15:27:18
334
原创 [修订版]Xenomai/IPIPE源代码情景解析
本文系统解析了Xenomai/IPIPE双内核架构的实现原理,通过源代码级分析,揭示了实时内核与通用内核协同工作的技术细节。
2025-09-08 21:40:47
358
原创 3.5_第三行之__ipipe_init()
本文分析了Linux实时内核IPIPE模块中__ipipe_init()函数的两个核心部分:IPIPE_CRITICAL_IPI处理机制和中断处理程序设置流程。首先详细跟踪了IPIPE_CRITICAL_IPI(1031号中断)从发送到处理的完整过程,包括多核同步机制和中断日志回放。其次说明了除1031外,root domain中其他中断号尚未设置处理程序的情况。文章通过10个步骤解析了IPIPE_CRITICAL_IPI的工作机制,展现了实时内核如何高效管理中断和实现多核协同。
2025-09-08 21:29:44
1388
原创 3.4_第二行之_ipipe_init_early()
本文介绍了IPIPE中的关键数据结构及其初始化过程。IPIPE采用分层域设计,包括Root域(ipipe_root)和Head域(ipipe_head_domain),分别对应Linux和Xenomai。每个CPU核心维护独立的上下文数据(ipipe_percpu_data),包含root、head和curr指针指向当前域。通过context_offset巧妙实现域与CPU上下文的快速映射。IPIPE还扩展了Linux中断处理,新增IPIPE_NR_IRQS等数据结构支持虚拟中断机制。这些设计为实时系统提供
2025-09-05 20:30:29
866
原创 3.3_第一行之hard_local_irq_disable
本文分析了Linux系统中中断使能与屏蔽的三重关卡机制,重点聚焦第三重关卡CPU core异常掩码标志的操作。第一重关卡是硬件控制器的IMR寄存器,第二重关卡是中断控制器的使能bit,采用延迟设置策略优化性能。第三重关卡通过操作CPU core的DAIF寄存器实现全局中断控制,提供了local_irq_enable/disable和local_irq_save/restore两对API分别用于直接控制和安全保存恢复场景。文章以ARM64架构为例,详细追溯了中断关闭从上层API到底层硬件寄存器的完整调用链,揭
2025-09-05 11:24:43
996
原创 3.2_内核初始化(盘古开天地)
本文以盘古开天地的神话为喻,生动解析Linux内核初始化过程。内核从0号进程开始,通过head.S和stext完成初始空间时间划分,类似盘古开天辟地。文章详细分析了内核入口地址计算、从_head到stext的跳转过程,以及内存空分复用的虚拟内存机制。整个初始化流程最终创建1号init进程和2号kthreadd线程,完成系统基本框架构建,如同盘古创造天地万物。这种形象化的解读方式有助于深入理解内核初始化的复杂过程。
2025-09-05 11:23:06
937
原创 服务器研发的历史变迁:从通用到定制化
摘要:服务器研发经历了从通用到定制化的演变历程。早期以Intel Xeon处理器为核心的通用服务器占据主导,但随着互联网发展,大型科技公司开始定制化需求。在AI时代,GPU成为服务器核心,NVIDIA和AMD推出"GPU+服务器+机柜"一体化方案。面对市场变革,OEM厂商通过快速响应、平台化复用、拓展非定制客户和争取生产份额等策略保持竞争力。服务器研发的变迁反映了技术进步与商业逻辑的互动,未来将在AI、量子计算等新技术推动下持续演进。
2025-09-04 11:23:11
1116
原创 3.1_四行启动代码与内核初始化神话
本文介绍了I-pipe在Linux内核启动过程中的关键初始化代码,该代码位于init/main.c的start_kernel函数中,仅包含四行核心调用。作者指出,虽然代码看似简单,但背后涉及复杂的初始化流程和设计考量,包括代码位置选择、初始化时机以及与传统Linux内核启动流程的交互等关键问题。文章预告将在后续章节深入探讨这些看似简单的四行代码背后蕴含的复杂技术内涵和设计哲学。
2025-09-04 11:15:32
133
原创 2.6_EL0_SYNC与EL1_SYNC_异常改造
本文分析了ARM64架构中EL0_SYNC异常处理的代码框架及其返回用户空间的流程。EL0_SYNC处理通过读取ESR_EL1寄存器判断异常类型,并跳转到相应分支处理。引入I-pipe补丁后,核心处理逻辑未变,但返回路径增加了判断:若进程处于HEAD域(Xenomai实时进程)则直接返回用户层;否则进入常规返回流程ret_to_user_noirq。该机制实现了实时与非实时进程的差异化处理。
2025-09-04 11:14:48
256
原创 2.5_EL1_IRQ_中断改造
本文分析了ARM64架构下EL1中断处理的代码框架,重点讲解了kernel_entry和kernel_exit宏的实现机制。kernel_entry负责将内核态现场按照pt_regs格式保存到进程内核栈,包括通用寄存器、栈指针和异常返回地址等;kernel_exit则执行反向操作恢复现场。文章还讨论了I-pipe对中断处理的改造,包括irq_handler返回值的三种场景处理(root域虚拟中断开/关、head域),以及抢占式内核(CONFIG_PREEMPT)对中断处理流程的影响。通过栈帧图示和代码注释,
2025-09-03 15:05:58
814
原创 2.4_EL0_IRQ_中断改造之返回
摘要 本文分析了ARM64架构下el0_irq中断返回用户空间的三种场景及处理流程。重点针对Xenomai实时系统与Linux的协同机制展开讨论,详细阐述了中断返回时对不同任务类型(Linux进程、Xenomai根域进程、Xenomai头域进程)的处理策略。研究发现,Xenomai通过TIP_USERINTRET标志位实现调试状态管理,在中断返回时结合信号处理机制,动态决定任务调度域(root域或head域)。系统通过精确控制中断屏蔽状态和任务标志位检查,确保实时任务与普通Linux任务的正确调度与切换。
2025-09-03 15:04:11
1348
原创 2.2_EL0_IRQ_中断改造之入口
本文分析了ARM64架构下el0_irq中断处理流程,重点剖析了kernel_entry和kernel_exit宏的实现机制。kernel_entry通过保存用户态寄存器到pt_regs结构体实现现场保护,同时处理单步调试标志位;kernel_exit则逆向恢复寄存器状态并返回用户空间。文章还指出I-pipe在el0_irq处的关键修改点,并特别说明当el0_irq发生时可能中断Linux或Xenomai两种用户态进程。通过详细的代码注释和示意图,清晰展现了中断处理过程中寄存器保存与恢复的技术细节。
2025-09-03 07:30:00
613
原创 2.3_EL0_IRQ_中断改造之中断处理
摘要 本文分析了ARM64架构下EL0级别中断处理的改造过程,重点介绍了中断栈切换机制和中断处理流程。当启用CONFIG_IPIPE配置时,内核引入实时协同内核支持,允许在中断栈上进行上下文切换和多级中断处理。通过irq_stack_entry/exit宏实现中断栈切换,使用irq_nesting计数器跟踪中断嵌套层级。handle_arch_irq_pipelined函数在原有中断处理基础上增加了返回值判断逻辑,影响后续流程走向。文章详细解析了中断栈指针管理、嵌套计数等关键机制,为理解实时内核中断处理提供
2025-09-03 07:30:00
1009
原创 1.3_拉取I-pipe代码
摘要:本文介绍了如何获取和使用I-pipe(中断管道)代码,针对ARM64架构的Linux 4.19内核版本。主要内容包括从官方FTP或Git仓库下载补丁文件,以及通过git命令拉取代码并切换到指定tag。文章分析了代码变动规律,说明I-pipe如何将上游Linux修改合并到自己的维护分支,并解释了基于CIP(民用基础设施项目)的长期稳定版本后缀含义。最后提到了最早的4.19版本补丁和最新补丁的获取方式,但作者选择继续使用4.19.209版本补丁进行分析。
2025-09-02 07:30:00
679
原创 2.1_ARM64中断机制与异常处理
本文介绍了ARM64架构下的中断机制与异常处理。ARM64的异常分为同步异常和异步异常两类,分别对应x86中的异常和中断。异常级别分为EL0-EL3四级,Linux主要运行在EL0和EL1。异常发生时,处理器会跳转到异常向量表,根据异常类型选择对应的处理程序。文章重点分析了EL0和EL1下的四种关键异常处理流程:el0_sync、el0_irq、el1_sync和el1_irq,其中IRQ异步中断处理最为复杂。I-pipe需要对系统调用和物理中断进行改造,确保实时内核的正确处理。
2025-09-02 07:30:00
1138
原创 1.2_I-pipe核心概念
本文介绍了I-pipe中断流水线的基本概念与工作机制。I-pipe采用两段式中断流水线设计,分为高优先级的Head Stage(实时内核Cobalt域)和低优先级的Root Stage(Linux域),通过虚拟中断标志实现中断传递与延迟执行。文章还阐述了交替调度机制,允许线程在out-of-band和in-band上下文中切换运行,以及Cobalt专有系统调用的处理方式。整体架构实现了物理中断与虚拟中断的解耦,在保证实时性的同时兼容Linux的正常运行。
2025-08-31 09:46:09
540
Adaptive Domain Environment for Operating Systems
2024-08-01
Fast Interrupt Priority Management in OS Kernels
2024-08-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅