文章作者: Liya Huang
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 wdfk-prog的个人博客!
相关推荐
2025-10-06
kallsyms
2025-10-03
init
[TOC] init/init_task.c 内核线程的一个核心特征是:它们没有自己独立的用户地址空间。它们只在内核空间运行,而内核地址空间是所有进程共享的。因此,内核线程不需要一个属于自己的内存描述符 struct mm_struct,所以它们的 task->mm 指针通常是 NULL init_task 就是大名鼎鼎的 PID 0 进程,也常被称为 swapper 进程。从它的标志位 .flags = PF_KTHREAD 可以看出,它是一个内核线程。 init_task 的调度策略(policy)是 SCHED_NORMAL,这意味着它是一个普通的分时调度任务,而不是实时任务。但是初始化阶段调用了init_idle(),使得它的sched_class 是 SCHED_IDLE,这样它就可以作为 CPU 的空闲任务运行。但是fork出来的其他进程继承的还是 SCHED_NORMAL 策略。 进程的“始祖”:init_task 是系统中所有进程的祖先。在系统启动后,它会创建第一个内核线程 kernel_init(它最终会成为 PID 1 的 i...
2025-10-03
cpu
[TOC] include/linux/cpumask.hcpumask_check 验证当前cpu数量是否超过了配置的最大cpu数量,并返回cpu1234567891011121314151617// 验证当前cpu数量是否超过了配置的最大cpu数量static __always_inline void cpu_max_bits_warn(unsigned int cpu, unsigned int bits){#ifdef CONFIG_DEBUG_PER_CPU_MAPS WARN_ON_ONCE(cpu >= bits);#endif /* CONFIG_DEBUG_PER_CPU_MAPS */}/* verify cpu argument to cpumask_* operators *///验证当前cpu数量是否超过了配置的最大cpu数量static __always_inline unsigned int cpumask_check(unsigned int cpu){ //small_cpumask_...
2025-10-03
dma
[TOC] kernel/dma DMA引擎(DMA Engine)与DMA映射(DMA Mapping)框架历史与背景这项技术是为了解决什么特定问题而诞生的?kernel/dma 目录下的代码是为了解决一个计算机体系结构中的核心问题:如何让外围设备(Peripherals)高效地与主内存(Main Memory)进行数据交换,而无需中央处理器(CPU)的持续干预。 在没有DMA(Direct Memory Access,直接内存访问)的系统中,当一个设备(如网卡)需要发送数据时,CPU必须亲自逐字节或逐字地从内存中读取数据,然后再写入到网卡的寄存器中。这个过程称为PIO(Programmed I/O)。对于大量数据的传输,这会完全占用CPU,使其无法执行其他计算任务,极大地降低了系统效率。 DMA技术引入了一个专门的硬件单元——DMA控制器(DMAC)。CPU只需配置好DMAC(告诉它源地址、目标地址、传输长度),然后就可以去做其他事情了。DMAC会接管总线控制权,直接在设备和内存之间搬运数据,传输完成后再通过中断通知CPU。 kernel/dma 子系统就...
2025-10-03
clocksource
[TOC] clocksource 内核时钟源(Kernel Clocksource) 为内核提供统一的时间基准历史与背景这项技术是为了解决什么特定问题而诞生的?clocksource框架的诞生是为了解决Linux内核中一个根本性的问题:如何以一种统一、可移植的方式来处理多样化的硬件计时器。 硬件的多样性:不同的CPU架构和平台提供了五花八门的硬件计时器,例如x86上的TSC(时间戳计数器)、HPET(高精度事件定时器)、ACPI PM Timer,以及ARM平台上的Architected Timer等。这些计时器的精度、速度、稳定性和编程接口各不相同。 缺乏统一抽象:在clocksource框架出现之前,内核中的时间管理代码与特定的硬件架构和计时器紧密耦合。这使得将内核移植到新平台变得困难,也难以在运行时动态选择最优的计时器硬件。 对高精度的需求:随着系统应用(如实时系统、高频交易、性能剖析)对时间精度要求的提高,内核需要一个能够充分利用现代高精度计时器硬件的框架。 clocksource框架通过创建一个通用的抽象层,将这些底层硬件计时器的差异性隐藏起来,为内核的上层时间子...
2025-10-03
regmap
[TOC] regmapRegmap 简介Regmap 是 Linux 内核中的一个子系统,用于抽象和管理设备寄存器的访问。它为驱动程序提供了统一的接口,支持多种总线(如 I2C、SPI、MMIO 等)上的寄存器操作,同时提供了缓存、锁机制和调试功能。Regmap 的设计目标是简化驱动开发,减少重复代码,并提高寄存器访问的效率和安全性。 工作原理1. 核心概念 寄存器映射 (Register Map):Regmap 将设备的寄存器抽象为一个统一的映射,屏蔽了底层总线的差异。 寄存器缓存:Regmap 提供了可选的寄存器缓存机制,用于减少总线访问次数,提高性能。 寄存器访问控制:通过配置文件(struct regmap_config),可以定义哪些寄存器是可读、可写或易失的。 总线适配器:Regmap 支持多种总线(如 I2C、SPI、MMIO 等),通过总线适配器实现具体的读写操作。 2. 数据结构 struct regmap:表示寄存器映射的核心数据结构,包含寄存器的地址、值、缓存等信息。 struct regmap_config:配置寄存器映射的结构体,用于定义...
评论