
linux内核数据结构-XArray
Guide XArray 是一种抽象数据类型,其行为就像一个非常大的指针数组。它满足许多与哈希或传统的可调整大小的数组相同的需求。与散列不同,它允许您以高效缓存的方式明智地转到下一个或上一个条目。与可调整大小的数组相比,无需复制数据或更改 MMU 映射即可增长数组。与双向链表相比,它具有更高的内存效率、可并行性和缓存友好性。它利用 RCU 来执行查找而无需锁定。 XArray与树、哈希表...

Guide XArray 是一种抽象数据类型,其行为就像一个非常大的指针数组。它满足许多与哈希或传统的可调整大小的数组相同的需求。与散列不同,它允许您以高效缓存的方式明智地转到下一个或上一个条目。与可调整大小的数组相比,无需复制数据或更改 MMU 映射即可增长数组。与双向链表相比,它具有更高的内存效率、可并行性和缓存友好性。它利用 RCU 来执行查找而无需锁定。 XArray与树、哈希表...

原文:Calling All Hackers 原作者: cts 前言 嗨, 我是 cts,也被称为 gf_256、ephemeral 或其他一些代号。 我曾是一名黑客,而现在是一家小公司的老板兼 CEO 。在这篇文章中,我想分享我在走这两条截然不同的道路时的经验。 黑客,是洞悉世界运行规律的人。 这种洞察力体现在当你输入 google.com 并按下回车时,你清楚背后发生了什...

原文:What is RCU? Part 2: Usage 引言 Read-Copy Update(RCU)是一种同步机制,2002年10月添加到Linux内核中。RCU 最常被描述为读写锁的替代品,但它也被以多种其他方式使用。RCU 的显著特点是 RCU reader 不直接与 RCU updater 同步,这使得 RCU 读路径非常快,并且允许 RCU reader 在与 RCU ...

原文:What is RCU, Fundamentally? 引言 Read-Copy Update(RCU)是一种同步机制,2002年10月添加到 Linu 内核中。RCU 通过允许读取与更新同时发生来实现可扩展性的提高。相比于传统的锁函数(传统锁函数使并发线程之间互斥,无论它们是 reader 还是 updater ),或读写锁(允许并发读但不能更新),RCU 支持单个 updat...

自旋锁 spin_lock spin_lock 是一种 忙等(busy waiting)锁。 当一个 CPU 想要进入临界区,但锁已被其他 CPU 持有时,它不会睡眠,而是反复循环检查锁状态,直到锁被释放。 它适合:临界区很短、不可睡眠 的场景(比如中断上下文)。 锁的结构 typedef struct spinlock { union { struct raw...

vmalloc、持久映射、固定映射 回顾一下第五、六章的内容:在32位的内核虚拟地址空间中, 只有$1G$的可用空间 (总共$2^{32} = 4G$ - 用户空间$3G$),如果物理内存超出$1G$, 那么kernel将无法寻址超出的那部分物理内存 (即高端内存 HIGH_MEMORY), 为了解决这个问题,kernel将内核空间分了两部分:可直接线性映射物理内存的$896MiB$普通内...

伙伴系统 在内核初始化完成后,内存管理的责任由伙伴系统(Buddy System)承担。它是基于一种相对简单效率的算法的高效的内存管理技术,一直到最新版本都还在使用。 伙伴系统的基本思想是将内存或资源分成大小相等的块(称为伙伴),每个块可以被分配给一个进程或线程使用。当一个进程或线程请求内存或资源时,系统会搜索一个空闲的伙伴来满足请求,如果找到了一个空闲的伙伴,系统会将其分配给请求者,并...

启动时的内存初始化 涉及硬件架构相关的功能均以i386结构为例 (经典的x86 且有高端内存的处理逻辑) 系统引导时,内核在物理内存中的结构 引导将内核载入到内存中,并跳转到相应的内存地址开始执行内核代码,在ia32架构下,内核在内存中的架构如上。 _text、_etext、_edata、_end的具体地址在编译后的System.map下,以线性地址表示,如: ...

通用内存的表示 基础概念 内存管理涉及的领域 内存中的物理内存页的管理; 分配大块内存的伙伴系统; 分配较小块内存的slab、slub和slob分配器; 分配非连续内存块的vmalloc 机制; 进程的地址空间。 内存地址空间、32位系统的寻址限制 Linux内核将地址空间划...

完全公平调度器类 Completely Fair Scheduler 数据结构 CFS的就绪队列 struct cfs_rq { struct load_weight load; unsigned long nr_running; //可运行进程数量 u64 exec_clock; //运行时间 u64 min...