自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(176)
  • 收藏
  • 关注

原创 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 822

原创 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 815

原创 3.2_内核初始化(盘古开天地)

本文以盘古开天地的神话为喻,生动解析Linux内核初始化过程。内核从0号进程开始,通过head.S和stext完成初始空间时间划分,类似盘古开天辟地。文章详细分析了内核入口地址计算、从_head到stext的跳转过程,以及内存空分复用的虚拟内存机制。整个初始化流程最终创建1号init进程和2号kthreadd线程,完成系统基本框架构建,如同盘古创造天地万物。这种形象化的解读方式有助于深入理解内核初始化的复杂过程。

2025-09-05 11:23:06 842

原创 服务器研发的历史变迁:从通用到定制化

摘要:服务器研发经历了从通用到定制化的演变历程。早期以Intel Xeon处理器为核心的通用服务器占据主导,但随着互联网发展,大型科技公司开始定制化需求。在AI时代,GPU成为服务器核心,NVIDIA和AMD推出"GPU+服务器+机柜"一体化方案。面对市场变革,OEM厂商通过快速响应、平台化复用、拓展非定制客户和争取生产份额等策略保持竞争力。服务器研发的变迁反映了技术进步与商业逻辑的互动,未来将在AI、量子计算等新技术推动下持续演进。

2025-09-04 11:23:11 993

原创 3.1_四行启动代码与内核初始化神话

本文介绍了I-pipe在Linux内核启动过程中的关键初始化代码,该代码位于init/main.c的start_kernel函数中,仅包含四行核心调用。作者指出,虽然代码看似简单,但背后涉及复杂的初始化流程和设计考量,包括代码位置选择、初始化时机以及与传统Linux内核启动流程的交互等关键问题。文章预告将在后续章节深入探讨这些看似简单的四行代码背后蕴含的复杂技术内涵和设计哲学。

2025-09-04 11:15:32 108

原创 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 235

原创 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 773

原创 2.4_EL0_IRQ_中断改造之返回

摘要 本文分析了ARM64架构下el0_irq中断返回用户空间的三种场景及处理流程。重点针对Xenomai实时系统与Linux的协同机制展开讨论,详细阐述了中断返回时对不同任务类型(Linux进程、Xenomai根域进程、Xenomai头域进程)的处理策略。研究发现,Xenomai通过TIP_USERINTRET标志位实现调试状态管理,在中断返回时结合信号处理机制,动态决定任务调度域(root域或head域)。系统通过精确控制中断屏蔽状态和任务标志位检查,确保实时任务与普通Linux任务的正确调度与切换。

2025-09-03 15:04:11 1304

原创 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 585

原创 2.3_EL0_IRQ_中断改造之中断处理

摘要 本文分析了ARM64架构下EL0级别中断处理的改造过程,重点介绍了中断栈切换机制和中断处理流程。当启用CONFIG_IPIPE配置时,内核引入实时协同内核支持,允许在中断栈上进行上下文切换和多级中断处理。通过irq_stack_entry/exit宏实现中断栈切换,使用irq_nesting计数器跟踪中断嵌套层级。handle_arch_irq_pipelined函数在原有中断处理基础上增加了返回值判断逻辑,影响后续流程走向。文章详细解析了中断栈指针管理、嵌套计数等关键机制,为理解实时内核中断处理提供

2025-09-03 07:30:00 976

原创 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 632

原创 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 1090

原创 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 509

原创 1.1_I-pipe与Xenomai

本文介绍了提高Linux实时性的两种方法:内核改造和双内核方案。重点分析了Xenomai项目的发展历程,特别是Xenomai3的架构设计。Xenomai3采用ADEOS框架和Cobalt实时内核,通过中断流水线技术实现硬件中断在Linux域和Cobalt域之间的传递。相较于原ADEOS设计,Xenomai3进行了优化改进,如仅支持两个操作系统域、采用虚拟中断标志等技术。目前Xenomai3是较稳定的版本,支持多种硬件架构,社区活跃度较高。

2025-08-31 09:38:31 919

原创 解决ROS2安装过程中无法连接raw.githubusercontent.com的问题

在安装ROS2时,许多开发者可能会遇到一个常见问题:执行sudo curl命令下载密钥时,出现**“Failed to connect to raw.githubusercontent.com port 443”**的报错。这一问题通常由DNS解析失败或网络限制导致。本文将详细介绍如何通过修改系统hosts文件解决这一问题。

2025-04-24 09:19:24 765

原创 gdb: 如何找到pthread_mutex_t死锁的owner

在多线程编程中,死锁是一个常见且棘手的问题。当两个或多个线程互相等待对方释放锁时,程序就会陷入死锁状态,导致所有相关线程都无法继续执行。为了快速定位死锁问题,调试工具 GDB 提供了强大的功能,允许我们深入分析线程和锁的状态。要真正掌握多线程编程,还需要深入理解线程同步机制、锁的使用原则以及并发编程的最佳实践。,我们可以快速找到死锁的持有者线程,从而更好地理解问题的本质。这种方法不仅适用于简单的死锁场景,还可以扩展到更复杂的多线程调试任务中。在调试过程中,尽量避免修改锁的状态,以免影响程序的正常运行。

2025-04-15 16:55:43 1208

原创 git: 如果追踪被删除的代码是哪个commit删除的?

在使用git blame时,默认情况下它只能显示当前文件中每一行代码的最后修改信息。如果某段代码已经被删除,那么直接使用git blame是无法追踪到这些被删除代码的历史记录的。

2025-04-15 16:48:18 358

原创 rpm必知100问:如何创建本地yum源?

创建本地YUM源是一个非常实用的技能,尤其在没有网络连接或需要确保软件包版本一致性的情况下。

2025-03-20 09:36:12 239

原创 GDB: 使用 Linux GDB 识别内存泄漏

本文档介绍如何在 Linux 上使用 GDB 跟踪内存泄漏。本文档适用于通过 malloc() 分配但未释放的内存块的内存泄漏问题。

2025-03-20 09:28:07 1117

原创 rpm必知100问:如何安装到指定目录而非默认根目录/?

rpm必知100问:如何安装到指定目录而非默认根目录/?

2025-03-19 09:56:23 263

原创 rpm必知100问:如何启用关闭yum源?

本文将详细介绍如何通过不同的方法来启用或禁用YUM源,包括永久设置和临时设置两种方式。

2025-03-19 09:44:49 469

原创 rpm必知100问:如何仅下载不安装? 下载到哪里去了?

默认下载到当前目录!

2025-03-18 15:44:24 237

原创 rpm必知100问:如何查看软件包的详细信息?

【代码】rpm必知100问:如何查看软件包的详细信息?

2025-03-18 11:30:18 150

原创 rpm必知100问:如何仅更新某个特定软件包?

【代码】rpm必知100问:如何仅更新某个特定软件包?

2025-03-17 09:44:02 103

原创 gdb:利用break和command计算函数执行时间

gdbcmd。

2025-03-17 09:40:31 1835

原创 lsof:正反向查找设备与进程关系

(List Of Open Files)是一个强大的工具,可以显示系统上打开的文件以及哪个进程正在使用它们。执行上述命令后,你会得到一个列表,其中包含使用该设备的所有进程的相关信息,如进程ID(PID)、用户、进程名等。如果设备正被用作某个挂载点,则表明它是通过文件系统被访问的,而不是直接由某个用户空间的进程打开的。命令(List Of Open Files),这是一个非常有用的工具,可以列出系统上所有打开文件的信息,包括设备。这个命令会列出所有由该进程打开的文件的符号链接,指向实际的文件路径。

2025-03-15 09:38:15 190

原创 rpm必知100问:安装内核rpm包会自动修改grub引导项吗?

rpm -qp --scripts kernel-5.10.134-17.an8.x86_64.rpm 没有找到post script,那么它是怎么触发grub更新呢?

2025-03-15 09:33:20 207

原创 rpm必知100问:如何查询rpm包安装过程中自动执行的scripts?

要查看RPM包中的脚本(如安装前、安装后、卸载前和卸载后的脚本),你可以使用rpm命令的--scripts选项。

2025-03-14 09:38:17 259

原创 rpm必知100问:如何查询RPM包的changelog?

替换为你想要查询的软件包的名字。如果你手头有RPM包的文件(即以。替换为你实际的RPM包路径。

2025-03-14 09:09:39 274

原创 rpm必知100问:如何查询RPM递归依赖树?

rpm必知100问:如何查询RPM递归依赖树?

2025-03-13 09:42:18 147

原创 rpm必知100问:如何更新软件仓库缓存?千万不要yum update

【代码】rpm必知100问:如何更新软件仓库缓存?

2025-03-13 09:41:41 145

原创 rpm必知100问:如何安装EPEL库?

EPEL(Extra Packages for Enterprise Linux)是一个由Fedora项目维护的,为Red Hat Enterprise Linux (RHEL)及其衍生发行版(如CentOS、Scientific Linux等)提供额外软件包的存储库。

2025-03-12 09:39:18 704

原创 rpm必知100问:如何模拟安装rpm包?

模拟安装 RPM 包可以帮助你在实际安装之前检查依赖关系、冲突和其他潜在问题,而不会对系统进行任何实际的更改。

2025-03-12 09:38:25 211

原创 rpm必知100问:如何解压缩rpm包?

这种方法允许你将 RPM 包转换为 cpio 归档文件,然后从中提取文件到指定目录。命令提取你感兴趣的文件。例如,如果你只想提取。:确保你已经有了需要解压的 RPM 包,例如。:如果你不再需要中间生成的。

2025-03-11 09:16:48 913

原创 rpm必知100问:如何把rpm包安装到指定目录?

这个选项主要用于创建一个新的系统环境或者在不同的目录结构中安装软件包,非常适合用于准备新的系统映像、chroot 环境或容器。但是,这种方法依赖于RPM包制作者是否在打包时加入了对这一选项的支持。)是一个全新的环境,可能需要先安装一些基础的系统包和依赖项。但请注意,不是所有的RPM包都支持这种方式,如果上述命令没有效果或报错,则说明该RPM包不支持此功能。如果有输出,则说明该RPM包可能支持自定义安装路径。选项时,你可以指定一个不同的根目录来安装软件包。:如果你想要测试安装结果,可以使用。

2025-03-11 09:16:17 1035

原创 四十不惑之rpm必知100问

记录工作中的点滴疑问,自查自用,方便道友!

2025-03-10 11:02:25 1540

原创 rpm必知100问:如何理解--force和--nodeps区别

在安装RPM包时,强制安装和忽略依赖关系安装是两种不同的选项,它们各自有不同的用途和风险。

2025-03-10 10:27:57 545

原创 6.4.3 Xenomai xnthread_relax原理

实时线程有时需要离开head域,转而在root域中执行,主要场景有两个:(1)执行非实时工作:运行涉及由Linux内核处理的常规系统调用的非时间关键(带内)工作。(2)处理CPU异常:从CPU异常中恢复,例如处理主要内存访问故障,对于这类故障,无需关注响应时间,也无需在实时核心中重复处理。

2025-03-06 09:31:25 1468 2

原创 rpm必知100问:如何查询命令或配置文件来自哪个rpm包?

rpm必知100问:如何查询命令或配置文件来自哪个rpm包?

2025-03-06 09:23:11 275

原创 rpm必知100问:如何查询RPM包来自哪个repo?

【代码】rpm必知100问:如何查询RPM包来自哪个repo?

2025-03-06 09:22:40 243

Adaptive Domain Environment for Operating Systems

Adaptive Domain Environment for Operating Systems

2024-08-01

Fast Interrupt Priority Management in OS Kernels

Fast Interrupt Priority Management in OS Kernels

2024-08-01

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除