- 博客(15)
- 收藏
- 关注
原创 ebpf: CO-RE, BTF, and Libbpf(一)
BTFBTF 是一种用于表达数据结构布局和函数签名的格式。在 CO-RE 中,它用于确定编译时和运行时所使用的数据结构之间的差异。同时它也被像 bpftool 这样的工具用来输出供人类可读的数据结构。Linux kernel 从 5.4 版本开始支持 BTF。内核头文件Linux kernel 的源码中包含了许多用于描述数据结构的头文件,这些头文件在不同内核版本间会有变化。
2025-04-07 21:49:55
374
原创 早期内存分配器 -- memblock
MEMBLOCK_NONE = 0x0, /* 无特殊要求 */MEMBLOCK_HOTPLUG = 0x1, /* 可热插拔的内存区域,后续可能会被移除 */MEMBLOCK_MIRROR = 0x2, /* 镜像区域 */MEMBLOCK_NOMAP = 0x4, /* 不添加到内存直接映射区域,将其视为reserved mem */MEMBLOCK_DRIVER_MANAGED = 0x8, /* 始终由驱动来管理的,不会被视为是系统RAM */
2025-03-24 22:34:42
751
原创 CMA详解
CMA(Contiguous Memory Allocator),译为连续内存分配器,旨在满足需要分配连续物理内存的需求,如camera, 视频编解码等。CMA出现之前,kmalloc可以满足常规的连续物理内存分配请求,但系统运行时间长了必然会导致内存碎片化,此时再想申请大块连续的物理内存就难上加难了。所以为了满足此类需求,我们需要预留出来一块内存,早期可以使用ioremap来映射一段私有内存,供后续使用。但缺陷在于当设备暂时不使用时,这段内存其他设备仍然无法使用,他不会将其还给操作系统!
2025-03-20 22:21:51
369
原创 Kmalloc详解
用于在kernel中为object申请小于一页的内存。object就是经常会用到的一些结构体,如task_struct。提前将内存分割成不同大小的块,用于一些常用的内存请求,尽可能避免了外部内存碎片,要知道从伙伴系统申请内存至少都要一页,就是4kb,这对于一些可能只需要几字节的需求来说太大了!具体可以去看下slab和伙伴系统的原理,这里不做详述。kmalloc是一个总的kernel内存申请的调用接口,根据申请内存的大小来判断是从伙伴系统申请还是从slab分配器申请。大于2。
2025-03-10 22:19:54
1028
原创 make menuconfig中找不到需要的config?
在编译sched_ext时报错如下:libbpf: failed to find ‘.BTF’ ELF section in /home/rinux/linux-6.12.10/vmlinuxError: failed to load BTF from /home/rinux/linux-6.12.10/vmlinux: No data available查询之后发现是没有配置CONFIG_DEBUG_INFO_BTF,但是在menuconfig中对应路径下找不到该配置其实是因为Depends o
2025-02-24 21:57:22
167
原创 Deadline调度器
对于单核系统,只要所有任务的利用率总和小于1,就可以保证所有任务都能满足其deadline的要求。扩展到多核系统上如何呢?参照单核系统的公式,在M核系统上是否利用率总和小于M就可以呢?直观上看似乎可以满足需求,有一个核心运行大任务,其余任务在其他核心上运行即可,时间非常充裕。
2025-02-22 18:06:50
888
原创 Linux Deadline调度器介绍
deadline调度器主要使用三个参数:runtime(运行时间)、period(周期)和deadline(截止时间)。算法确保任务可以在period内获得runtime的运行时间,且可以在deadline之前执行完毕。每次任务唤醒时,先计算一个deadline,然后调度器会选择具有最早deadline的任务去运行。第一个很好理解,当前的运行时间已经大于deadline了,自然要更新下一次deadline了。
2025-02-16 19:35:26
473
原创 EEVDF代码详解(一)
EEVDF是由Peter Zijlstra提出并在kernel-6.6中合入主线的调度算法,已经替代CFS成为Linux kernel中普通进程的默认调度器。基本介绍可参考,本文针对EEVDF中的一些关键代码进行讲解。
2025-02-15 18:57:20
1406
原创 如何高效搜索? -- 搜索引擎的奇技淫巧
可以搜索指定网站的内容,如平时搜索一些kernel中相关patch的讨论就可以用到:EEVDF site:lkml.org可以精准搜索某个句子或词组,例如:“Earliest Eligible Virtual Deadline First” site:lkml.org搜索出来的内容会确保带有完整的Earliest Eligible Virtual Deadline First可以确保搜索结果为某个文件类型,在搜一下文档资料时很有用,例如:eevdf filetype:pdf则搜索结果只会是包含
2025-02-15 10:43:46
214
原创 CFS的完美进化版 -- EEVDF调度器简介
EEVDF(Earliest Eligible Virtual Deadline First),翻译为最早合格的虚拟截止日期优先。CFS调度算法根据其原理也可以解释为“最小虚拟时间优先”,因为其核心调度逻辑就是挑选vruntime最小的进程。而EEVDF现在将最小虚拟时间改为了最早虚拟截止日期,相同点就是都是用虚拟时间判断的,可以推断还是通过weight来对物理时间进行加权;不同之处就是用截至日期代替了之前的运行时间,截至日期从字面意思就可以判断其更强调调度延迟。
2025-02-14 22:32:05
644
原创 详解CFS调度(四)—— PELT
PELT(Per-entity load tracking),实现了对每个调度实体(也就是每个task或task group)进行负载追踪。在此之前,是通过跟踪每个cfs_rq来进行负载的计算以及进行评估系统loading、进程调度、负载均衡等一系列决策的。如何定义负载呢?我们知道如果cpu有一半时间在运行程序,另一半时间空闲,那cpu利用率就是50%,如果一直在运行,那利用率就是100%,这种情况下cpu刚好处于满载状态运行。如果cpu满载的情况下,仍有一些程序无法运行,处于runnable状态呢?
2025-02-13 22:22:59
855
原创 进程优先级:NICE值的设定
理想状态下,当系统中有多个程序在运行时,我们希望他们是同时运行的,共享cpu时间,按需分配cpu算力。而实际情况是:一个cpu同一时间只能运行一个程序,那想要模拟理想状态,就只能每个程序运行一小段时间,轮流运行,只要切换足够快,用户无法感知,也就实现了用户视角下的并行。但任务对用户来说并不一视同仁,有轻重缓急之分。用户希望一些关键的程序可以有很好的响应度,而用户不关心的程序可以运行较短时间。我们引入进程优先级的概念来解决这个问题。
2025-02-12 22:36:15
998
原创 详解CFS(三)—— 组调度
那如果A用户启动了9个task,而B用户只启动了一个task,那A用户将占用cpu 90%的资源,这与我们预期相去甚远。cfs_rq是他的runqueue,保存他所掌管的所有task,在多核系统中,一个group的多个task可能运行在不同的cpu中,所以task group在每个cpu上都会有一个se和cfs_rq。task group在当前cpu上的ge的权重是由当前cpu上group runqueue中所有task的总权重占该task group在所有cpu上task总权重的百分比决定的,即。
2025-02-11 21:53:37
1032
原创 详解CFS调度(二)
上篇概述了CFS的原理,本篇结合代码看一下CFS的具体实现。1. 内核中有哪些类型的进程?进程优先级如何表示?2. vruntime如何更新?3. vruntime什么时候更新?4. 调度器如何挑选下一个要执行的任务?
2025-02-09 21:14:13
725
ARM Energy-Aware Scheduling (EAS)技术概述与集成指南 - 架构特性及其实现详解
2025-02-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人