- 博客(38)
- 收藏
- 关注
原创 tasklet串行化源码深度分析:tasklet_action_common函数
摘要(≤150字): tasklet_action_common 是 tasklet 串行执行的核心函数,负责处理本 CPU 的 tasklet 队列。它首先禁中断,将链表头清空并重置尾指针,确保后续操作原子性;随后遍历队列,通过 tasklet_trylock 保证同一任务仅由一个 CPU 执行,避免并发冲突;若任务未被禁止(count == 0),则调用其回调函数,并清除调度标志。该机制实现 tasklet 在多核环境下的“跨核并行、同核串行”,简化编程复杂度,保障数据安全。
2026-09-11 21:56:32
174
原创 ARCH_DEFINE_STATIC_CALL_TRAMP宏解析
本文分析了Linux内核中DEFINE_STATIC_CALL宏的展开实现。该宏会生成一个跳转桩(trampoline)函数,通过.pushsection/.popsection指令在.static_call.text段中创建跳转代码,包含jmp指令和相对偏移量。这种静态调用机制避免了间接调用的性能开销,同时支持运行时通过修改跳转目标实现热补丁。文章详细解析了汇编代码生成过程、跳转偏移量计算方式,并展示了内存布局示意图,说明该机制如何在内核性能监控等场景中发挥作用,实现比函数指针调用快2-3倍的性能优化。
2026-06-11 10:31:28
225
原创 Linux宏clamp(val, lo, hi)的作用
摘要:本文分析了Linux内核中的clamp宏实现,该宏用于将数值限制在指定范围内。通过min和max宏的组合,clamp能确保输入值val处于[lo,hi]区间内:若val小于lo则返回lo,大于hi则返回hi,否则返回val本身。实验验证了三种情况:10在[5,15]内返回10,3低于下限返回5,20超出上限返回15。该实现使用typeof进行类型检查,确保参数类型一致。
2026-03-29 18:29:46
249
原创 调度域中宏SD_FLAG到底是什么?
本文分析了Linux内核5.15版本中sd_flags.h宏文件在topology.c中的展开过程。sd_flags.h定义了调度域(SD)标志的宏,包含SDF_SHARED_CHILD等基础标志。在topology.c中,这些宏被展开为三种形式:1)生成枚举类型的标志索引和位标志;2)构建调试用的sd_flag_debug结构数组,包含元标志和名称;3)生成SD_DEGENERATE_GROUPS_MASK位掩码,通过检查SDF_NEEDS_GROUPS特性筛选有效标志。其中SD_WAKE_AFFINE因
2026-03-16 13:04:17
177
原创 DRM KMS 子系统(5)Device/demo
本文介绍了Linux内核中DRM子系统的核心数据结构drm_device及其应用。drm_device作为用户空间与内核空间KMS驱动的桥梁,管理图形显示设备并提供三类次设备接口:主设备、控制设备和渲染设备。文章详细阐述了设备初始化、注册流程及用户空间交互机制,并通过一个单缓冲区的Demo示例展示了DRM设备操作的基本流程,包括打开设备、获取资源、创建帧缓冲区和设置显示模式等关键步骤。最后介绍了drm_driver结构在DRM设备功能实现中的作用,以及设备销毁的相关操作。
2026-01-23 22:05:12
800
原创 DRM KMS 子系统(4)Planes/Encoder/Connector
本文介绍了DRM(Direct Rendering Manager)显示框架中的三个核心组件:Plane、Encoder和Connector。Plane是图像图层,包括主图像层(PRIMARY)、光标层(CURSOR)和叠加层(OVERLAY),支持硬件加速的图像合成。Encoder负责将像素数据转换为适合物理传输的格式,如TMDS编码。Connector代表显示接口(如HDMI、DP等),负责信号传输、连接检测和显示模式管理。文章详细说明了各组件的功能、类型及相关的驱动接口函数,为理解现代显示系统的工作原
2026-01-17 16:27:48
703
原创 DRM KMS 子系统(3)CRTC
本文介绍了Linux内核显示架构中的CRTC(CRT控制器)组件。CRTC是显示管道的核心,负责管理显示时序、分辨率和刷新率等关键参数,通过drm_crtc_funcs和drm_crtc_helper_funcs两个接口实现功能。硬件框图中展示了CRTC从帧缓冲区获取数据并处理后输出的流程。文章详细解释了显示时序所需的像素时钟、垂直同步和水平同步信号,并分析了page_flip机制如何避免画面撕裂现象,通过在垂直消隐期切换帧缓冲区来确保画面完整更新。
2026-01-10 21:45:18
659
原创 DRM KMS 子系统(2)Framebuffer
摘要:Framebuffer是存储显示内容信息的数据结构,包含显存引用、帧格式和活跃区域信息。其实现依赖于显存管理(如GEM/TTM)和显示控制器能力(DMA传输类型、IOMMU支持)。drm_framebuffer数据结构使用FOURCC编码描述像素格式(RGB/YUV/C8),其中YUV格式分为紧凑型、半平面型和多平面型,分别对应不同的内存组织方式。pitches和offsets数组用于描述每行长度和像素数据偏移,最多支持4个平面(如YUV三平面)。具体实现可参考Linux内核中的相关驱动代码。
2026-01-03 21:32:14
760
原创 DRM KMS 子系统(1)简介
本文介绍了Linux图形显示架构中的DRI、DRM和KMS技术框架。DRI是X Window系统下的直接渲染基础设施,DRM是处理GPU的核心模块,KMS则是DRM中负责显示设置的子模块。与传统FBDEV驱动相比,DRM提供了更细粒度的显示控制,支持层叠加等高级特性。文章通过Zynq 7000硬件实例,展示了DRM框架下Framebuffer、CRTC、Encoder和Connector等组件如何协同工作,实现从内存到视频输出的完整渲染管线。整体而言,DRM/KMS架构为现代图形显示提供了更灵活、高效的解决
2025-12-26 17:35:28
904
原创 Deepin适配Xorg
本文介绍了Xorg服务器及fbdev驱动的编译与移植过程。主要内容包括:1) 相关软件包说明,包括xserver源码包、fbdev驱动源码包和预编译包;2) 修改软件源配置;3) 详细记录了xorg-server源码的编译步骤,包括依赖包安装和编译命令;4) 介绍了fbdev驱动的移植编译过程,包括配置修改、驱动重命名和编译方法;5) 测试方法说明,包括驱动安装、配置文件设置和使用shadowfb加速技术。整个流程涵盖了从源码编译到实际测试的关键步骤,为Xorg服务器和fbdev驱动的定制开发提供了完整指导
2025-12-18 11:42:28
757
原创 BUG: failure at drivers/pci/msi.c:376/free_msi_irqs()!
摘要:本文分析了PCI显示模块卸载过程中出现的两个关键问题。首先,由于未调用free_irq释放DMA中断导致内核panic,通过检查发现xxfbhw_dma_exit函数中缺少free_irq调用。其次,添加free_irq后仍报错"Trying to free already-free IRQ",原因是free_irq的第二个参数与request_irq的最后一个参数不一致。最终解决方案是在xxfbhw_dma_exit中正确调用free_irq(xx_par->irq_dma
2025-12-12 16:20:25
309
原创 ngbe网卡丢包(drop)问题排查
摘要: 在CentOS系统中,ngbe标准网卡出现持续丢包现象,ifconfig显示RX dropped持续增加,但网卡驱动ethtool统计显示无丢包。通过tcpdump确认丢包发生在内核协议处理阶段。使用dropwatch工具追踪发现丢包主要出现在__netif_receive_skb_core和ip_rcv_core等内核网络协议栈函数中,表明丢包由内核协议处理逻辑导致,而非网卡硬件或驱动问题。后续需进一步分析内核协议栈配置或性能瓶颈。
2025-12-05 14:30:34
696
原创 lockdep中__lock_release分析
本文分析了Linux内核锁释放机制的实现细节。主要内容包括:1)锁栈数据结构存储在task_struct中,最大深度为48,通过lockdep_depth记录当前深度;2)释放锁时从栈顶开始递减遍历查找匹配的锁;3)释放处理包括修改统计时间和减少引用计数;4)调整锁栈时先修改深度和chain_key,然后重新加入剩余锁并重新计算。整个过程通过移动锁栈元素实现删除,并重新计算后续锁的chain_key。
2025-11-27 14:01:08
433
原创 lockdep检测状态(./-/+/?)符号在get_usage_chars的含义
本文分析了Linux内核lockdep工具中锁状态符号的含义。内核文档和代码注释显示,锁类历史状态可分为4n+1种,其中4表示不同上下文(硬中断、软中断)下的读写锁状态。通过分析get_usage_char()函数实现,揭示了4个状态符号(./+/-/?)的精确含义: '.'表示非中断上下文且IRQ禁用 '+'表示非中断上下文且IRQ使能 '-'表示中断上下文且IRQ禁用 '?'表示中断上下文且IRQ使能 这些符号出现在锁状态输出时,表示锁在4个核心状态(硬中断写/读、软中断写/读)下的使用情况。代码通过u
2025-11-20 14:59:39
684
原创 lockdep状态相关定义如LOCK_ENABLED_HARDIRQ
摘要: 本文分析了Linux内核中LOCK_ENABLED_HARDIRQ等上下文状态的定义位置和生成机制。这些宏定义通过lockdep_internals.h引用lockdep_states.h文件实现,采用"定义>包含>取消定义"的模板模式。重点解析了enum lock_usage_bit枚举类型,展示了HARDIRQ和SOFTIRQ状态如何通过宏展开生成LOCK_USED_IN_、LOCK_ENABLED_等系列标志位。进一步说明了这些枚举值对应的位掩码定义(LOCKF
2025-11-12 17:40:24
268
原创 复合页Compound Page理解
本文介绍了Linux内核中的复合页(Compound Page)机制。复合页通过将物理上连续的多个页组合成一个大页,用于创建大页内存(hugepage)和透明大页(THP)。文章分析了复合页的数据结构组成,包括头页和尾页的特殊字段设置。复合页的主要作用是减少TLB缺失和页错误次数,提升大内存分配效率。文章还讨论了复合页的特点:属于纯软件功能不需要硬件支持,不能减少页表项但能优化内存分配性能,并介绍了判断页类型的"folio"概念。该机制在分配大块连续内存时能显著提升性能。
2025-11-02 21:14:18
621
原创 rpm安装lustre包报错fs/fs/fs/fs/fs/...
文章摘要:在UOS Server 20系统安装Lustre文件系统的kmod-lustre-osd-ldiskfs RPM包时出现递归死循环错误。分析发现是由于/lib/modules路径下存在递归的fs符号链接导致,手动删除后安装完成。进一步对比发现不同版本的RPM包安装脚本存在差异,2.15.6版本未使用"-name *.ko"过滤导致问题。通过kernel_module_package宏定义确认了内核模块的标准安装流程,该宏负责处理依赖关系、安装路径和depmod等操作。建议在RP
2025-10-27 13:42:19
1200
原创 Linux osq_lock(二)
本文分析了Linux内核5.15版本中的原子操作和内存屏障机制。首先介绍了原子交换函数xchg/atomic_xchg和比较交换函数atomic_cmpxchg_acquire/release的功能与实现差异。重点探讨了osq_lock中smp_wmb内存屏障的作用,通过链表节点入队和出队场景说明了其对操作顺序的保障机制。同时揭示了unqueue操作中的内存屏障隐含在xchg函数调用中。最后指出了acquire/release语义在osq锁中的具体应用实现。文章为理解Linux内核并发控制机制提供了实用分析
2025-10-17 21:32:56
1117
原创 Linux osq_lock(一)
本文分析了Linux 5.15内核中的osq_lock(乐观自旋队列锁)实现机制。文章详细解读了osq_lock函数的工作流程,包括节点入队、等待获取锁、解除队列等步骤。重点讨论了next指针的不可靠性问题,说明在多核并发场景下节点指针可能失效的原因及处理方式。通过图示和代码分析,展示了当多个CPU同时尝试退出自旋队列时可能出现的竞争条件及解决方案。文章还引用了相关数据结构和参考文档,为理解内核乐观自旋机制提供了技术细节。
2025-10-14 23:50:59
1386
原创 READ_ONCE、smp_store_release在io_uring中实例分析
文章摘要(150字) Linux内核中READ_ONCE和smp_store_release用于多线程场景下的内存访问同步。READ_ONCE通过volatile临时强制读取内存,避免编译器优化,适用于中断、多核、硬件寄存器等场景;相比直接定义volatile变量更灵活。smp_store_release结合内存屏障和WRITE_ONCE,确保写入顺序性,常用于生产者-消费者模型(如环形缓冲)。以io_uring为例,用户态通过*sq->ktail=tail更新提交队列尾,内核态通过smp_store
2025-09-30 23:32:32
760
原创 乱序执行真的会导致内存一致性问题吗?
内存屏障的实现原理主要涉及写屏障(smp_wmb)和读屏障(smp_rmb)两种机制。写屏障通过清空当前store buffer,确保指令之前的写操作更新到本地cache,使其他cache能够获取新值;读屏障通过清空当前invalid queue,保证指令之前的读操作能获取其他cpu已更新的最新值。经典的a=1/b=1案例展示了由于store buffer和invalid queue的存在可能导致内存可见性问题。虽然指令重排序能提高执行效率,但通过重排序缓存(ROB)机制可以保证最终执行结果的正确性。内存屏
2025-09-23 20:02:22
1098
原创 io_uring最简单的实例io_uring-test.c分析
本文介绍了Linux内核io_uring异步I/O机制及其封装库liburing的使用。io_uring提供了三个核心系统调用:io_uring_setup初始化上下文、io_uring_enter提交请求和获取结果、io_uring_register注册资源。liburing库通过io_uring_queue_init、io_uring_get_sqe、io_uring_prep_*系列函数、io_uring_submit和io_uring_wait_cqe等接口简化了使用流程。文章以io_uring-t
2025-09-16 22:38:09
1186
原创 slurmrestd报错:setsockopt(SO_REUSEADDR) failed: Protocol not available
摘要:在XX架构上安装slurm-24.11.3后,运行slurmrestd时出现"setsockopt(SO_REUSEADDR) failed: Protocol not available"错误。经分析发现,该问题与架构相关,主要由于代码错误地将addr->ai_socktype作为setsockopt的level参数而非SOL_SOCKET。通过测试验证,虽然不同架构的SO_REUSEADDR等宏定义值不同但功能正常,最终通过修改源码将参数改为SOL_SOCKET解决了该问
2025-09-08 17:52:15
1399
原创 linux Kbuild详解关于fixdep、Q、quiet、escsq
本文详解了Linux内核构建系统Kbuild中if_changed_rule的any-prereq和arg-check原理,重点分析了fixdep工具的作用机制。fixdep是一个用于处理依赖关系的工具,它通过解析.config文件生成include/config/目录下的依赖项,并过滤掉对autoconf.h的直接依赖。文章还介绍了make命令的V参数(0/1/2)控制编译输出的详细程度,以及Q和quiet变量的作用。此外,解释了escsq宏用于转义单引号的实现原理,并对.config与autoconf.
2025-09-07 18:59:25
1411
原创 linux Kbuild详解关于if_changed_rule的any-prereq和arg-check原理及info调试
本文分析了Linux内核Kbuild系统中增量编译的实现原理,重点研究了scripts/Makefile.include中的if_changed_rule机制。if_changed_rule通过any-prereq和arg-check两个关键变量判断是否需要重新编译:any-prereq检测依赖文件是否更新或缺失,arg-check比较当前和历史编译命令是否变化。文章详细解析了两个变量的实现细节,包括依赖文件时间戳比较、命令参数处理等,并介绍了如何通过.info宏进行调试。这些机制共同确保了内核构建时只重新
2025-09-04 20:27:44
934
原创 windows系统vbox下ubuntu运行modetest
本文介绍了在Ubuntu 20.04虚拟机环境下编译libdrm源码并通过SSH远程控制DRM显示的过程。首先下载并编译libdrm-2.4.100源码,解决了pciaccess依赖问题。然后在Ubuntu中配置SSH服务,使用Xshell远程登录。通过modetest工具获取DRM信息,识别出vmwgfx设备,并成功将虚拟机显示设置为800x600分辨率。整个过程涵盖了从源码编译到远程显示控制的关键步骤,展示了Linux下图形显示系统的底层操作方法。
2025-09-02 19:56:39
1029
原创 kprobe学习记录(insn/aggr/trampoline/XOL/opcode)
本文解析了Linux内核中kprobe机制的核心实现原理。重点分析了kprobe结构体中的三个关键字段:addr(符号地址)、opcode(原始指令备份)和ainsn(动态执行上下文),以及hlist和list分别处理哈希冲突和同地址多探测的功能。同时解释了常见缩写:aggr(聚合)、insn(指令)和XOL(脱机执行)。最后对比了ARM64架构下三种指令探测状态:INSN_REJECTED(不可探测)、INSN_GOOD_NO_SLOT(可探测但无需槽页)和INSN_GOOD(需槽页探测),并总结了各自的
2025-08-31 16:36:53
1486
原创 shell函数function和$(function)调用有区别吗?
Shell函数调用方式有两种:直接调用和使用$()调用并赋值。关键区别在于$()调用会创建子进程,导致变量不共享。通过strace工具跟踪进程执行情况,可以验证$()调用确实会生成新的子进程,而直接调用则不会。例如,当使用$(change)调用函数时,变量修改不会影响父进程中的变量值,而直接调用则会影响。这一差异在Shell脚本编程中需要特别注意,以避免意外的变量作用域问题。
2025-08-29 23:18:53
494
原创 【多目录makefile递归编译示例】【四】makefile疑难知识点(ifdef、伪目标、FORCE、让make停下来、“:=”和“=”区别、$$)
本文总结了Makefile中9个常见问题及解答:1) ifdef判断变量是否定义的条件;2) .PHONY伪目标的正确用法;3) .PHONY不能作为首个目标;4) FORCE伪目标与.PHONY的区别;5) 使make停止的方法;6) ":="和"="赋值的区别;7) makefile与shell命令的区别;8) 解释$$在makefile中的特殊处理;9) shell中$$的含义。通过示例代码详细说明了变量替换、命令执行、目标声明等机制在不同场景下的行为差异,帮助
2025-08-27 10:49:00
812
原创 【多目录makefile递归编译示例】【三】递归逻辑分析
本文通过分析一个多目录递归编译的Makefile示例,揭示了Makefile递归编译的核心机制。文章首先介绍了顶层Makefile的执行流程,详细解析了目标依赖关系、文件生成规则以及子目录的递归调用方式。然后分别剖析了包含子目录和不包含子目录两种情况的目录级Makefile实现,展示了相同的任务拆解模式:将目标拆解为.c文件的目标.o和依赖目录的bi.a。最后重点阐述了递归的秘密在于"dir/bi.a:dir"的设计模式,通过目录作为依赖实现自动化变量传递,确保各级目录行为一致。这种设计
2025-08-26 23:23:15
913
原创 优快云实用操作(图片位置缩放、字体颜色、链接格式、圆圈内带数字符号、图片清晰处理免费网站、关注博主即可阅读全文设置、文章目录)
本文介绍了优快云博客编辑的实用技巧,包括:1.图片排版方法(上下/左右排列、位置调整、缩放设置);2.字体颜色设置;3.链接格式规范;4.圆圈数字符号输入;5.图片处理工具推荐;6.设置"粉丝可见"功能;7.自动生成文章目录的方法。通过具体代码示例和效果展示,帮助用户快速掌握优快云文章的排版技巧,提升博客的可读性和美观度。
2025-08-25 14:22:45
861
原创 【多目录makefile递归编译示例】【二】顶层Makefile/子目录makefile
本文介绍了多目录Makefile递归编译的实现方法。顶层Makefile负责管理整个项目的编译流程,通过make -C命令递归调用子目录的makefile,收集各子目录生成的中间目标文件(如bi.a)。子目录makefile使用ld -r将多个目标文件合并为可重定位的中间文件,而顶层Makefile则通过gcc -o将这些中间文件链接为最终可执行文件。文章详细解析了关键代码行,包括目录遍历、依赖关系定义、变量替换机制等,并提供了清理操作的实现方法。这种分层编译结构使得大型项目的构建更加模块化和可维护。
2025-08-24 21:42:53
1016
原创 【多目录makefile递归编译示例】【一】示例简介及执行流程
本文介绍了一个多目录递归Makefile的编译示例,展示了其执行流程和文件结构。示例包含根目录下的Makefile和多个子目录中的makefile,能够自动识别并编译.c文件。通过图示详细说明了编译过程中目录切换、目标文件生成和最终可执行文件test的链接过程。文章还展示了示例代码a.c和m.c的内容,以及程序运行结果"hello m=3 from a"。该示例有助于理解Linux内核编译框架原理,并可方便地扩展支持其他文件类型。
2025-08-24 16:55:09
1080
原创 时间不准问题调查(RTC不准?sysclock不准?ntp服务器时钟源不准?)
摘要:UOS系统在联网测试中出现时间快速偏移问题,10分钟快7秒。经排查发现是chronyd服务同步了内部不准确的时间服务器(172.16.104.1)导致。断开网络后时间正常,关闭chronyd服务后问题解决。文章介绍了三种时间同步服务(NTPd、systemd-timesyncd、Chrony)的区别,并分析了系统时间源(系统定时器和RTC硬件时钟)的工作原理。最终通过内核打印确认是chronyd进程调用adjtimex导致时间异常。(149字)
2025-08-22 23:58:21
951
原创 数组为{{}}和{}的ARRAY_SIZE一样吗?记“i2c-3: Can‘t create device at 0x00”查错
摘要: 调试内核时出现"i2c-3: Can't create device at 0x00"错误,经分析发现是由未定义宏导致的空I2C设备数组初始化异常。当使用xx_i2c_devices[] = {{}}形式时,数组长度被识别为1,导致向I2C列表添加了0地址设备;而改为xx_i2c_devices[] = {}后,数组长度正确识别为0,避免了错误地址的注册。通过简化实验验证了不同初始化方式对数组长度的影响,最终通过调整数组初始化方式解决了该问题。
2025-08-20 18:48:25
347
原创 Xshell实用技巧(会话设置、鼠标选中即拷贝右键粘贴、多窗口分屏、日志、串口)
本文介绍了Xshell客户端工具的实用技巧:1)快速创建和复制SSH会话;2)设置鼠标选中即复制、右键粘贴功能;3)实现多窗口分屏操作;4)开启日志记录功能;5)配置串口连接方法;6)提供SSH连接前的网络测试方法。这些技巧能显著提升Xshell的使用效率,特别适合需要管理多台服务器的开发运维人员。
2025-08-16 21:09:09
1412
原创 记住5个Source Insight操作快捷键,让你瞬间撸码自如
摘要:本文为Source Insight新手提供核心快捷键指南。重点介绍了5个必备操作:1)Ctrl+左键跳转定义;2)Alt+,/.前进后退;3)F8高亮;4)Ctrl+F局部搜索;5)Ctrl+/全局搜索。补充说明替换(Ctrl+H)、行号跳转(F5)等实用功能,建议通过保存Project Files和Symbol窗口优化界面布局。掌握这些快捷键可显著提升代码浏览和编辑效率,适合快速上手这款经典代码编辑工具。
2025-08-13 11:54:05
1436
原创 如何提取被编译的源文件(提取linux内核源码为例)
本文介绍了两种源码提取工具cce_for_linux_kernel和cce,用于从大型项目中提取实际编译的源代码。cce_for_linux_kernel专为Linux内核开发设计,可通过分析编译依赖关系将内核源码缩减至原大小的1/5,便于学习研究。通用工具cce支持各类C/C++项目,已成功在多个开源软件上测试验证。两种工具都能显著减少代码量,提高代码阅读效率,适用于内核学习、项目快速上手和培训材料制作等场景,帮助开发者聚焦核心代码,提升工作效率。
2025-08-09 22:27:12
1296
Linux多张BMP图片显示测试程序
2025-08-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅