compiler
[toc] include/linux/build_bug.hstatic_assert 静态编译警告123456789101112131415161718/** * static_assert - 在构建时检查整数常量表达式 * * static_assert() 是 C11 _Static_assert的包装器,具有 * little 宏魔术使消息成为可选的(默认为 * 测试表达式的字符串化)。 * * 与 BUILD_BUG_ON() 相反,static_assert() 可以在 global * 范围,但要求表达式为整数常量 * 表达式(即,__builtin_constant_p() 是不够的 * true 表示 expr)。 * * 另请注意BUILD_BUG_ON,如果条件为 * true,而 static_assert() 如果表达式为 *假。 */#define static_assert(expr, ...) __static_assert(expr, ##__VA_ARGS__, #expr)#define __static_assert...
namespace
[TOC] Linux Namespaces (kernel/nsproxy.c, kernel/user_namespace.c, etc.) 内核隔离与虚拟化的基石历史与背景这项技术是为了解决什么特定问题而诞生的?Linux Namespaces(命名空间)是为了在单一内核上实现**操作系统级虚拟化(OS-level Virtualization)而诞生的。其核心目标是隔离(Isolate)和虚拟化(Virtualize)**全局的系统资源,使得一个进程组(A group of processes)能看到一套独立的系统资源,仿佛它们运行在一个独立的操作系统上,而实际上它们与其他进程组共享同一个内核。 这项技术解决了以下关键问题: 轻量级隔离:在虚拟机(VM)技术出现之前或并行发展中,业界需要一种比完整虚拟化(模拟整个硬件)开销小得多的隔离方案。Namespaces通过隔离内核数据结构而非模拟硬件,实现了极低的性能开销。 资源划分与视图分离:Unix的传统设计中,许多资源是全局唯一的,例如进程ID(PID)1是init进程,只有一个主机名,一套网络接口等。...
bits
[toc] include/linux/bits.hBIT_WORD 位图的字数12345678//include/asm-generic/bitsperlong.h#ifdef CONFIG_64BIT#define BITS_PER_LONG 64#else#define BITS_PER_LONG 32#endif /* CONFIG_64BIT */#define BIT_WORD(nr) ((nr) / BITS_PER_LONG) include/linux/bitmap.hbitmap_weight 位图的权重 用于计算位图(bitmap)中设置为 1 的位的数量(即权重) 1234567static __always_inlineunsigned int bitmap_weight(const unsigned long *src, unsigned int nbits){ if (small_const_nbits(nbits)) return hweight_long(*src & BITMAP...
内存管理与访问
[toc] include/linux/cache.h: 提供与CPU缓存行对齐相关的宏,如 ____cacheline_aligned__cacheline_aligned 缓存行对齐 这个修饰符确保变量在内存中对齐到缓存行的边界上。缓存行对齐可以减少缓存行冲突,提高缓存命中率,从而提高系统性能。在多处理器系统中,缓存行对齐尤为重要,因为多个处理器可能同时访问相同的内存区域。通过对齐,可以减少缓存一致性协议带来的开销。 在多处理器系统中,缓存行对齐可以减少缓存一致性协议带来的开销,主要原因如下: 缓存一致性协议:在多处理器系统中,每个处理器都有自己的缓存,用于存储频繁访问的数据。为了确保所有处理器看到的数据是一致的,系统使用缓存一致性协议(如MESI协议)。当一个处理器修改了某个缓存行中的数据,其他处理器必须更新或失效其缓存中的相应数据。这种一致性维护会带来额外的开销。 缓存行对齐的好处 减少伪共享:伪共享(False Sharing)是指多个处理器访问同一个缓存行中的不同数据项,导致频繁的缓存一致性操作。通过缓存行对齐,可以确保每个处理器访问的数据项位...
sync
[toc] fs/sync.c 数据同步(Data Synchronization) VFS层缓存回写的核心控制历史与背景这项技术是为了解决什么特定问题而诞生的?fs/sync.c 及其实现的一系列系统调用(sync, fsync, fdatasync)是为了解决操作系统设计中一个最根本的矛盾:性能与数据持久性(Durability)之间的权衡。 性能需求:物理磁盘(无论是机械硬盘还是SSD)的读写速度远低于内存(RAM)。为了提高I/O性能,Linux内核引入了页缓存(Page Cache)。当应用程序写入文件时,数据通常只是被写入到内存中的页缓存,并被标记为“脏”(Dirty),然后系统调用会立即返回成功。这种异步写入或**写回缓存(Write-back Cache)**机制极大地提高了写入操作的响应速度。 数据持久性需求:仅将数据写入内存是不可靠的。如果此时系统突然断电或崩溃,所有存在于页缓存中但尚未写入磁盘的“脏”数据都将永久丢失。对于数据库、文件编辑器、事务日志等关键应用来说,这会导致数据损坏或丢失,是不可接受的。 fs/sync.c中的同步(S...
内核支持与数据
[toc] Makefile宏LINUX_ARM_ARCH12345678910111213141516//arch/arm/Makefile# Note that GCC does not numerically define an architecture version# macro, but instead defines a whole series of macros which makes# testing for a specific architecture or later rather impossible.cpp-$(CONFIG_CPU_32v7M) :=-D__LINUX_ARM_ARCH__=7cpp-$(CONFIG_CPU_32v7) :=-D__LINUX_ARM_ARCH__=7cpp-$(CONFIG_CPU_32v6) :=-D__LINUX_ARM_ARCH__=6# Only override the compiler option if ARMv6. The ARMv6K extensions are# always avai...
底层CPU与体系结构宏
[toc] include/asm-generic/rwonce.h: 提供 READ_ONCE() 和 WRITE_ONCE() 宏,防止编译器优化,保证单次读写的原子性1234567/* * 阻止编译器合并或重新获取读取或写入。还禁止编译器对 READ_ONCE 和 WRITE_ONCE 的连续实例重新排序,但前提是编译器知道某些特定排序。使编译器了解 Sequences 的一种方法是将 READ_ONCE 或 WRITE_ONCE 的两次调用放在不同的 C 语句中。 * * 这两个宏也适用于聚合数据类型,如结构体或联合体。 * * 它们的两个主要用例是:(1) 调解进程级代码和 irq/NMI 处理程序之间的通信,所有处理程序都运行在同一个 CPU 上,以及 (2) 确保编译器不会折叠、纺锤或以其他方式破坏不需要排序或与提供所需排序的显式内存屏障或原子指令交互的访问。 */ compiletime_assert_rwonce_type __native_word 是一个宏,用于检查给定类型是否是本机字长(通常是 32 位或 64 位)。如果类型不是本机...
通用工具与错误处理宏
[toc] include/linux/once_lite.h: (一次性调用) 提供确保某段代码在多核环境下只被精确执行一次的宏 每个宏仅在第一次使用时,执行函数功能.通过静态变量来实现一次性调用的功能 12345678910111213141516171819202122232425262728/* 调用一次函数。类似于 DO_ONCE(),但不通过jump label使用跳转标签修补。 */#define DO_ONCE_LITE(func, ...) \ DO_ONCE_LITE_IF(true, func, ##__VA_ARGS__)//通过静态变量来实现一次性调用的功能#define __ONCE_LITE_IF(condition) \ ({ \ static bool __section(".data..once") __already_done; \ bool __ret_cond = !!(condition); \ bool __ret_once = false;...
filemap
[TOC] mm/filemap.c: Linux 页缓存 (Page Cache) 的心脏mm/filemap.c 是 Linux 内核中实现和管理页缓存 (Page Cache) 的核心源文件。页缓存是 Linux I/O 性能的基石,它将磁盘上的文件内容缓存到物理内存(RAM)中,使得后续对同一文件的读写操作可以直接在内存中完成,从而避免了缓慢的磁盘 I/O。 可以把 mm/filemap.c 想象成一个高效的“图书管理员”,它负责管理一个巨大的图书馆(页缓存),图书馆里的每一页书(struct page)都对应着磁盘文件上的某一页内容。 一、 核心职责mm/filemap.c 的代码几乎参与了所有与文件 I/O 相关的内存操作,其核心职责包括: 页缓存的查找与插入 (Finding and Inserting): 当需要读取文件数据时,它负责在页缓存中查找是否已缓存了对应的页面。如果找到(Cache Hit),则直接返回内存页;如果未找到(Cache Miss),则负责分配一个新的物理页,并将其插入到页缓存中,准备从磁盘加载数据...
通用数学与位操作宏
[toc] include/asm-generic/div64.h : 提供64位除法操作的通用实现# arch/arm/include/asm/div64.h1234567891011121314151617181920212223242526272829/* * __div64_32() 的语义是: * * uint32_t __div64_32(uint64_t *n, uint32_t base) * { * uint32_t remainder = *n % base; * *n = *n / base; * return remainder; * } * * 换句话说,一个 64 位的被除数和一个 32 位的除数产生 64 位的结果和 32 位的余数。 为了以最佳方式实现这一点,我们覆盖了 lib/div64.c 中的通用版本,以使用完全非标准参数和结果调用约定的 __do_div64 程序集实现(当心)。 */static inline uint32_t __div64_32(ui...








