fair
[toc] kernel/sched/fair.c 完全公平调度器(Completely Fair Scheduler, CFS) Linux默认的普通进程调度策略历史与背景这项技术是为了解决什么特定问题而诞生的?kernel/sched/fair.c 是Linux内核**完全公平调度器(Completely Fair Scheduler, CFS)**的核心实现。它的诞生是为了彻底取代在它之前的O(1)调度器,并解决其固有的复杂性和公平性问题。 O(1)调度器虽然调度决策速度快,但它依赖于一套非常复杂的、启发式的算法来“猜测”一个进程是否是“交互式”的,并动态地调整其优先级。这导致了以下问题: 公平性不足:其启发式算法并不完美,常常导致某些进程获得不公平的CPU时间份额。 代码复杂难懂:包含大量“魔法数字”和复杂的逻辑,难以维护和调试。 可调优性差:nice值对进程行为的影响不直观,难以预测。 CFS的出现,旨在用一个极其简单、优雅且可证明的公平模型来取代这一切。其核心目标不再是使用复杂的技巧去追踪进程行为,而是去模拟一个**“理想的、完美多任务的...
preempt
[TOC] include/linux/preempt.h 内核抢占(Kernel Preemption) 控制内核代码的可抢占性与延迟历史与背景这项技术是为了解决什么特定问题而诞生的?include/linux/preempt.h 是定义**内核抢占(Kernel Preemption)相关API和配置的头文件。这项技术的诞生是为了解决早期Linux内核的一个核心设计局限性:内核态执行的不可抢占性(non-preemptibility),以及由此导致的系统响应延迟(latency)**问题。 在Linux 2.6版本之前,内核是非抢占式的。这意味着,当一个进程通过系统调用进入内核态执行时,它会一直占有CPU,直到它自愿放弃(例如,因等待I/O而睡眠)或执行完毕返回用户空间。这种模型的缺点是: 高延迟:如果一个低优先级的进程执行了一个非常耗时的系统调用(例如,对一个大文件进行复杂的读写),那么一个刚刚被唤醒的、需要立即响应用户输入的高优先级进程(如桌面窗口管理器或文本编辑器)将不得不一直等待,直到那个系统调用完成。这会导致系统UI卡顿,响应迟...
idle
[toc] kernel/sched/idle.c 空闲调度(Idle Scheduling) CPU无事可做时的最终选择历史与背景这项技术是为了解决什么特定问题而诞生的?kernel/sched/idle.c 的实现是为了解决一个操作系统中最基础、最本质的问题:当CPU上没有任何有意义的工作(没有可运行的进程或内核线程)时,CPU应该做什么? 一个CPU不能简单地“停止”,它必须始终在执行指令。因此,系统必须提供一个“最后的选择”——一个特殊的任务,在所有其他任务都无法运行时来占用CPU。这个任务就是空闲任务(Idle Task)。 然而,仅仅让CPU执行一个空、、循环(while(1);)是远远不够的,这会带来一个巨大的新问题:功耗。一个在循环中空转的CPU会以最高速度运行,消耗大量电力,产生大量热量,这对于任何设备(尤其是移动设备)都是不可接受的。 因此,idle.c 的核心目标有两个: 提供一个默认的执行流,确保CPU永远有事可做。 实现极致的节能,通过将空闲的CPU置于深度睡眠的低功耗状态来节省能源。 它的发展经历了哪些重要的里程碑或版本迭...
syscalls
[toc] kernel/sched/syscalls.c 调度相关的系统调用(Scheduler-Related System Calls) 用户空间与调度器交互的接口历史与背景这项技术是为了解决什么特定问题而诞生的?kernel/sched/syscalls.c 这个文件本身并不是一种“技术”,而是用户空间与内核调度器进行交互的官方API层。它的存在是为了解决一个至关重要的问题:如何为一个用户空间的应用程序提供一个稳定、受控且安全的接口,使其能够查询或影响自身以及其他进程的调度行为。 内核调度器(fair.c, rt.c, deadline.c等)是一个极其复杂的内部子系统。如果没有syscalls.c这一层“防火墙”和“翻译官”,就会出现以下问题: 缺乏控制:用户程序将无法请求更高的执行优先级(如实时音频应用)、降低后台任务的影响(如批处理任务),或将任务绑定到特定的CPU核心以优化性能。 安全漏洞:任何程序都可以随意修改系统上所有进程的优先级,一个普通用户进程就能通过提升自己为最高优先级的实时任务来饿死所有其他进程,导致系统完全锁死。 缺乏抽象...
debug_locks
[TOC] debug_locks 各种锁的常用调试工具的通用位置: 自旋锁、rwlocks、mutex 和 rwsems。 debug_locks 的介绍debug_locks 是 Linux 内核中用于调试各种锁(如自旋锁、自读写锁、互斥锁和读写信号量)的工具。它提供了一种机制,用于检测锁的使用错误,并在发现问题时记录或报告相关信息。 特点 全局控制:通过全局标志 debug_locks,可以一次性启用或禁用所有锁的调试功能。 静默模式:支持通过 debug_locks_silent 实现“静默失败”,即在检测到锁错误时不打印任何信息到控制台。 原子操作:使用 xchg 等原子操作确保在多线程环境中安全地切换调试状态。 减少噪声:在检测到第一个锁错误后,可以关闭后续的调试输出,避免日志被大量错误信息淹没。 使用场景 锁错误检测: 在开发和调试阶段,用于检测锁的使用错误,例如死锁、锁未正确释放等问题。 适用于调试自旋锁(spinlock)、读写锁(rwlock)、互斥锁(mutex)和读写信号量(rwsem)等。 内核模块开发: 在开发内核模块时,debu...
sched
[TOC] kernel/sched 调度器核心(Scheduler Core) 进程调度与上下文切换的决策中心历史与背景这项技术是为了解决什么特定问题而诞生的?kernel/sched/core.c 及其关联文件(如fair.c, rt.c)共同构成了Linux内核的进程调度器(Process Scheduler)。这项技术是为了解决在分时多任务操作系统中一个最根本、最核心的问题:在多个可运行的进程(或线程)之间,如何以及何时分配有限的CPU时间,以达到系统设定的目标。 这些目标通常是相互冲突的,调度器的设计就是在它们之间做出权衡和取舍: 公平性(Fairness):确保每个普通进程都能获得合理的CPU时间份额,防止任何进程被“饿死”。 吞吐量(Throughput):最大化系统在单位时间内完成的总工作量。这通常有利于长时间运行的计算密集型任务。 响应性(Responsiveness):最小化交互式任务(如GUI应用、文本编辑器)的响应延迟,让用户感觉系统“流畅”。这要求任务能被快速唤醒并执行。 实时性(Real-time):确保需要满足严格截止时间(dead...
irq_work
[toc] include/linux/irq_work.h__IRQ_WORK_INIT1234567#define __IRQ_WORK_INIT(_func, _flags) (struct irq_work){ \ .node = { .u_flags = (_flags), }, \ .func = (_func), \ .irqwait = __RCUWAIT_INITIALIZER(irqwait), \}#define IRQ_WORK_INIT(_func) __IRQ_WORK_INIT(_func, 0) kernel/irq_work.c IRQ上下文延迟工作(IRQ Context Deferred Work) 在安全时机执行来自中断的紧急任务历史与背景这项技术是为了解决什么特定问题而诞生的?kernel/irq_work.c 实现的irq_work机制是为了解决一个非常特殊且棘手的内核同步问题:如何从一个“硬中断(Hard IRQ)”上下文中,安全地执行一个需要...
drivers
[toc] drivers/irqchip/irqchip.cirqchip_init 初始化函数12345678910//.lds__irqchip_of_table = .; KEEP(*(__irqchip_of_table)) KEEP(*(__irqchip_of_table_end)) . = ALIGN(8);extern struct of_device_id __irqchip_of_table[];void __init irqchip_init(void){ of_irq_init(__irqchip_of_table); acpi_probe_device_table(irqchip);} drivers/irqchip/irq-nvic.cnvic_irq_init 初始化函数1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575...
clk
[TOC] drivers/clk 时钟管理框架(Common Clock Framework) SoC时钟资源的统一抽象历史与背景这项技术是为了解决什么特定问题而诞生的?drivers/clk 目录中的代码实现了Linux内核的“通用时钟框架”(Common Clock Framework, CCF)。这项技术的诞生是为了解决在现代片上系统(SoC)中一个极其复杂且普遍存在的问题:时钟资源的管理混乱、缺乏统一抽象和代码不可移植。 一个现代SoC内部包含着一个庞大而复杂的时钟树,里面有成百上千个独立的时钟源,用于驱动不同的硬件模块(CPU核、GPU、内存控制器、UART、I2C、SPI、显示引擎等)。在CCF出现之前: ** vendor特定实现**:每个SoC厂商(如TI, NXP, Samsung, Rockchip)都在其BSP(板级支持包)中实现一套自己独有的、非标准的API来管理时钟。 驱动不可移植:一个为TI芯片编写的UART驱动,如果想移植到NXP的芯片上,其所有与时钟相关的代码(如何使能时钟、如何设置波特率所需的时钟频率)都必须完全重写。 电源管理...
interrupt
[TOC] include/linux/interrupt.hor_softirq_pending 软中断待处理状态12345678DEFINE_PER_CPU_ALIGNED(irq_cpustat_t, irq_stat);EXPORT_PER_CPU_SYMBOL(irq_stat);#define local_softirq_pending_ref irq_stat.__softirq_pending#define local_softirq_pending() (__this_cpu_read(local_softirq_pending_ref))#define set_softirq_pending(x) (__this_cpu_write(local_softirq_pending_ref, (x)))#define or_softirq_pending(x) (__this_cpu_or(local_softirq_pending_ref, (x))) raise_timer_softirq 定时器软中断12345678static in...






