- 博客(71)
- 收藏
- 关注
原创 Sched_ext 回调深度解析(四):runnable —— 任务状态转换的哨兵(6.18.26)
本文深入分析了Linux内核调度器框架sched_ext中的runnable回调机制。作为任务状态转换的关键哨兵,runnable在任务首次变为可运行状态时触发,与enqueue形成互补但解耦的关系。文章通过源码解析揭示了runnable的三种触发场景(唤醒、迁移和恢复),并详细阐述了其与running等状态回调共同构成的任务执行状态跟踪体系。通过调用链分析和核心代码解读,展示了enqueue_task_scx()如何协调状态标记、粘性CPU处理等关键逻辑,最终触发runnable回调通知BPF调度器。该机
2026-05-27 20:19:58
361
原创 K8s 容器运行 UnixBench — 代理机器执行记录
摘要 本文记录了在受限网络环境下为K8s容器准备UnixBench性能测试镜像的全过程。由于目标机器(10.59.42.83)无法访问外网,通过代理机器完成了镜像构建和传输工作。主要步骤包括:尝试拉取镜像失败后,修改Dockerfile绕过SSL验证问题,成功构建并导出128MB的镜像文件。在SCP传输失败后改用手动传输方式,并提供了目标机器的镜像导入命令。整个过程解决了镜像仓库不存在、SSL验证失败、Docker权限问题和SSH连接限制等多个技术难点,最终实现了在受限环境中部署性能测试工具的目标。
2026-05-27 09:56:47
403
原创 Sched_ext 回调深度解析(五):enqueue —— 任务入队,调度器的核心决策点(6.18.26)
Linux sched_ext调度框架中的enqueue回调机制分析 摘要:本文深入分析Linux sched_ext调度框架中的enqueue回调机制。作为eBPF调度器的核心钩子之一,enqueue负责将就绪任务放入调度队列(DSQ)。研究基于Linux 6.18.26内核源码,揭示enqueue的三个关键特性:(1)必须调用scx_bpf_dsq_insert将任务放入DSQ;(2)可被select_cpu的直接分发跳过;(3)BPF调度器拥有任务所有权。文章详细梳理了enqueue的五大触发场景,包
2026-05-26 14:26:12
346
原创 Sched_ext 回调深度解析(三):select_cpu —— 任务唤醒时的选核决策(6.18.26)
本文深入分析了Linux内核sched_ext框架中的select_cpu回调机制。作为eBPF调度器框架的关键组件,select_cpu在任务唤醒时负责选择目标CPU,具有三个核心特性:决策非最终性(后续调度阶段可修改)、空闲CPU自动唤醒机制以及直接分发优化路径。文章通过时序图展示了select_cpu在任务生命周期中的触发时机,对比了其与其他回调(如init_task、enable等)的本质区别,并详细解析了两种典型触发场景(任务唤醒和exec执行)的处理逻辑。最后,通过流程图总结了select_cp
2026-05-25 13:42:11
378
原创 Sched_ext 回调深度解析(七):running —— 任务开始执行(6.18.26)
本文分析了Linux内核eBPF调度器框架sched_ext中的running回调钩子。running在每次任务被调度到CPU执行时触发,与stopping构成调度循环。文章通过对比init_task、enable等一次性钩子,阐明running的周期性特点,并梳理了从__schedule()到running的完整调用链。关键点包括:running挂接在ext_sched_class的set_next_task方法上,与stopping成对出现;调度路径通过pick_task_scx选择任务后,经由put_
2026-05-20 13:46:18
554
原创 Sched_ext 回调深度解析(二):enable —— 任务被调度器接管的关键时刻(6.18.26)
本文分析了Linux内核中sched_ext调度器的enable回调机制。当任务被sched_ext调度器正式接管时触发enable回调,完成从READY到ENABLED状态的转换。与init_task不同,enable回调仅在任务真正由sched_ext管理时触发。文章详细介绍了底层机制,包括调度类选择(scx_setscheduler_class)、任务接管流程(scx_enable_task)以及三种触发场景:注册调度器时批量切换、fork新任务时自动继承和系统调用主动切换。通过流程图展示了状态转换过
2026-05-20 10:34:03
507
原创 Sched_ext 回调深度解析(一):init_task —— 每个任务走进调度器的第一道门(6.18.26)
本文分析了Linux内核中sched_ext调度器框架的init_task钩子函数,重点阐述了其两种触发场景和实现机制。核心发现包括: init_task会在两种情况下触发: 调度器注册时批量初始化已有任务(遍历全局scx_tasks链表) 注册后新fork的任务(在fork流程中调用) 注册过程通过scx_enable_workfn分阶段执行: 先进入bypass模式保护状态 第一轮遍历初始化所有现存任务 开启调度标志后第二轮遍历切换任务调度类 最终退出bypass模式使调度器生效 关键实现细节: 使用s
2026-05-16 21:30:45
406
原创 Sched ext回调1——init_task (linux 6.15.7)
本文分析了schedext调度器中init_task钩子的触发机制。该钩子在两种情况下触发:1)注册调度器时遍历已有任务链表scx_tasks执行初始化;2)新任务fork时若scx_ops_init_task_enabled标记为true则触发。文章详细展示了fork和注册调度器时的调用栈流程,指出用户态任务名称在fork时继承父进程,内核态任务则直接设置真实名称。特别强调init_task的执行时机早于其他调度钩子,为任务调度提供了初始化保障。
2026-01-20 16:51:07
873
原创 eBPF/Sched Ext 编程注意事项
访问数组元素,要显示限制索引值。如果不限制索引值,运行时报错:Global function XXX doesn't return scalar. Only those are supported. “doesn't return scalar.”是 verifier 在控制流分析失败时最常见的“兜底错误”,并不一定是函数返回值不对。下面代码在 cst->buckets[idx]前,判断idx >= NBUCKETS就return。
2025-12-29 14:30:27
1048
原创 sched_ext的update_idle函数(linux 6.15.7)
先看注释,见 kernel/sched/ext.c当cpu进入或退出idle状态时(对应的是,cpu开始执行init_task、停止执行init_task),调度器框架代码会执行struct sched_ext_ops -> update_idle。
2025-11-19 15:27:17
918
原创 eBPF per-CPU map用法示例
本文介绍了eBPF中per-CPU类型map的使用方法。首先定义了一个包含CPU空闲时间统计信息的per-CPU数组map,每个CPU副本中只有一个元素。在用户态程序中,通过bpf_map_update_elem()一次性初始化所有CPU的map值。使用bpftool工具可以查看map内容,确认各CPU的idle_ns值被正确设置。在eBPF程序中,通过bpf_map_lookup_elem()获取当前CPU的map值,注意key要设为0表示访问该CPU副本中的唯一元素。最后展示了eBPF程序读取并打印各C
2025-10-24 17:10:23
316
原创 虚机安装及一些基本操作
先下载虚机配置文件geshifei-vm1.xml:链接: https://pan.baidu.com/s/15wXohrZxFti4NwmK8XEyIg 提取码: 1234注意,这只是从 libvirt 的数据库里去掉了这台虚机,虚机的磁盘文件还在,如果确认不用了,可以通过“六”节将磁盘文件也删除。
2025-10-21 17:52:33
1023
原创 eBPF Skeleton
本文介绍了eBPF程序的基本结构和加载方式。eBPF程序分为内核空间的hook函数和用户空间的加载程序,前者有严格限制,后者可自由编写。加载方式包括底层的bpf()系统调用、基于libbpf库的加载以及更高级的Skeleton方式。Skeleton是libbpf生成的代码,封装了eBPF程序的ELF文件信息,简化了加载流程,支持CO-RE技术。文章详细说明了Skeleton的生成方法、使用示例以及如何通过Skeleton修改eBPF变量和map。最后解释了Skeleton的数据结构,展示了其如何通过&quo
2025-10-05 22:27:03
1009
原创 sched_ext调度器task stall分析
cpu 32因高负载导致local DSQ非空,一致无法执行dispatch函数,无法运行kworker/32:2线程线程。其他部分cpu空闲,虽然可执行dispatch函数,但因为kworker/32:2线程的cpu mask不允许运行在“非32核”上,也不能运行kworker/32:2线程。整个系统无任何cpu可运行kworker/32:2,导致kworker/32:2 task stall异常。
2025-09-25 21:22:09
844
原创 IgH初始化--未接从站
所以ec_fsm_master_state_broadcast中的if条件不好被执行,最终执行最后的ec_fsm_master_restart的函数,在ec_fsm_master_restart函数中将状态机设置为ec_fsm_master_state_start并立即执行。ecrt_master_send发送ec_fsm_master_state_start封装的报文。ec_fsm_master_state_start封装报文,待发送。执行ec_fsm_master_state_broadcast函数。
2025-08-15 17:06:48
870
原创 运行sched_ext调度器
系统信息Linux内核从6.12版本开始正式支持sched_ext调度程序,所以需升级内核至6.15.7或其他高版本。
2025-08-15 15:31:30
1117
原创 调度器类sched_class
内核版本:linux 6.15.7按优先级,从高到低:STOP > RT > FAIR > EXT > IDLE二、调度器类存在哪调度器类按照优先级存在__sched_class_highest开始、以__sched_class_lowest结束的段中。每个调度器类存在在对应的xx_sched_class段中。链接脚本vmlinux.lds.h控制了各个调度器类在段中的位置顺序,这个顺序决定了优先级关系。__section("__" #name "_sched_class")定义
2025-08-14 20:14:27
465
原创 eBPF的helper函数
helper函数,是内核提供给 eBPF 程序调用的辅助函数。eBPF 程序本身是个小型沙盒程序,不能直接访问内核的所有资源。这些helper函数是内核预先实现的,可以让eBPF程序完成复杂功能,而不用自己写复杂的代码。
2025-08-13 10:17:06
152
原创 eBPF简明使用教程
编译生成bpf可执行程序bpf_program.o和加载器bpfload。从upstream或者欧拉社区,下载对应版本的内核源码,并mv到根目录。修改helloword中的loader.c源码,增加如下。
2025-08-06 20:26:36
99
原创 如何通过kgdb调试vbox中的kernel
其他版本的vbox、ubuntu iso,可能会有一些bug,要么增强工具按装不了,要么更改kernel后ubuntu没有图形界面。推荐用上面版本的vbox+ubuntu:-- 如果无法打开terminal,需要更改Setting --> Region & Language中的Language和Formats-- ubuntu的kernel版本,Linux ubuntu18 5.4.0-84-generic-- 增强工具正常-- 图形界面正常。
2025-03-13 21:33:36
1083
原创 bcache的基本操作
1,停止bcache设备lsblk<====停止前,存在bcache0设备#停止bcache设备lsblk<===没有bcache0设备了2,擦除backingdevice上的superblock信息3,按4k大小格式化backingdevice。
2025-01-20 10:37:31
1459
原创 ubuntu20.04 调试bcache源码
搭建单步调试bcache的环境,/dev/sdb作为backing dev, /dev/sdc作为cache dev。
2024-12-25 23:49:29
1339
原创 TwinCAT3 实时核中ADS实现C++ server、clinet数据传输
Automation Device Specification,ADS设备间进行通信的协议规范。协议定义了ADS device之间如何寻址对方、ADS device之间可以执行哪些操作、执行这些操作需要哪些参数,以及操作完成后如何返回结果等。
2024-09-10 22:00:00
3921
原创 Twincat ADS 报文分析(Sum Write)
或者网盘下载:链接:https://pan.baidu.com/s/188GY9zuIrDFMXiTqky4MWg提取码:a9k2抓包工具安装在ADS通讯的机器上,比如我的环境:在开发机中编写一个模块A、B通讯的程序,然后下载到工控机中,那么抓包工具需要安装在工控机上(而不是开发机上)。
2024-09-04 21:45:00
1346
原创 kasan排查kernel内存越界示例(linux5.18.11)
参考资料:1,内核源码目录中的Documentation\dev-tools\kasan.rst2,
2024-03-07 17:19:17
1841
1
原创 Ethercat“APWR配置从站地址”报文分析(0x0010:0x0011)
基于IgH主站接了3个从站,分析报文。一条Ethercat报文中可以包含多个子报文,每个子报文的地址由ADP+ADO组成,ADP即16 bit High Addr,ADO即16 bit Low Addr。APWR模式下,ADP代表的是从站在网络中按连线顺序的地址,比如与master连接的第一个从站的ADP=0x00,第二个从站的ADP=0x01,第三个从站的ADP=0x02,以此类推。ADO代表的是从站物理寄存器地址,寄存器地址可参考。
2024-01-02 16:35:00
2446
原创 Ethercat“BWR配置从站地址”报文分析(0x0010:0x0011)
涉及的从站寄存器:Configured Station Address (0x0010:0x0010)。使用场景举例:IgH启动后,通过“配置从站地址”报文将所有从站地址清零,然后通过APWR指令+“配置从站地址”报文,设置各个从站的地址。
2023-12-23 18:29:41
1770
原创 Ethercat “BRD读从站状态”报文分析(0x0130:0x0131)
涉及的从站寄存器:Register AL Status 0x0130:0x0131。
2023-12-22 20:31:26
1786
1
原创 IgH调试注意事项
现象:虚拟机中运行IgH master并绑定网卡后,主站由ORPHANED状态转换成IDLE状态,但无法收发数据报。这是因为虚拟机用的是虚拟网卡,需通过iptables将数据包到转发到真实的网卡上,实现收发数据的目的。但IgH替换了网卡驱动程序,收到数据包后,处理流程没有走内核的网络协议栈,所以工作中tcp/ip层的iptables就不起作用,导致IgH无法正常收发报文。解决:物理机安装ubuntu用来测试IgH。
2023-12-21 19:48:30
1721
1
原创 IgH Master环境搭建
在ubuntu20.04中搭建一个IgH主站。目标:实时linux内核中运行IgH主站,ethercat的用户态工具能看到主站信息。
2023-11-17 13:09:08
1635
原创 android存储4--初始化.emulated设备的挂载
在正式介绍挂载视图前,需要讲一下bind mount。绑定挂载命令:bindmount --bind olddir newdir1)将olddir绑定到newdir。绑定后,olddir和newdir看到的都是olddir中的内容(newdir中绑定前的内容变不可见)。2)命令中的olddir对应内核mount函数的dev_name参数,newdir对应mount的dir_name参数。
2023-07-28 21:00:00
4993
2
原创 android存储3--初始化.unlock事件的处理
SystemServiceManager收到unlock事件后,遍历service链表,依次执行各个service的onUserUnlocking,对于存储service,执行的是StorageManagerService$Lifecycle中的onUserUnlocking,在这个方法中,存储的StorageSessionController、vold、storaged模块进行各自初始化操作。
2023-06-22 17:38:41
2636
原创 android存储2--初始化.存储service的启动
存储有3个关键service:mount、vold、storaged,通过adb shell "service list"可以看到。service代码路径system/vold 目录(注意,虽然vold是一个用户态程序,但它的log默认在内核里,需通过dmesg查看)system/core/storaged 目录mount service负责mount和umount存储设备或存储卷,提供文件系统的访问接口。它的mount、umount请求下发给native层的vold处理。
2023-06-19 12:52:34
1592
原创 android存储1--初始化.清理环境
开机后,StorageManagerService收到开机广播消息H_BOOT_COMPLETED,按时间顺序完成以下5件事情:代码整体逻辑如下: 代码路径:StorageManagerServiceHandler::handleMessage --> handleBootCompleted --> initIfBootedAndConnected分两种情况:1)用户目录采用硬件加解密(native encryption),此阶段什么事也不做,函数直接返回2)用户目录采用软件加解密(enmulated
2023-04-18 12:42:48
1817
1
原创 f2fs函数: current_nat_addr(linux 5.18.11)
一个block中含有NAT_ENTRY_PER_BLOCK个entry(455个),根据nid可以算出nat entry在第N个block中(见NAT_BLOCK_OFFSET宏),由于2个segment一组进行备份,所以nat entry实际在第【N*2】个block上(如果nat entry位于segment B中),或者在第【N*2-segment B中nid所在block的偏移量】个block上(如果nat entry位于segment A中)。
2023-04-14 20:00:00
354
原创 StorageManagerService.java中的mVold.mount
StorageManagerService.java中的mVold.mount
2023-04-07 22:01:21
1012
原创 linux trace point机制2--增加trace event
include\trace\events目录下新增fuse.h文件/* 在/d/tracing(软链接指向/sys/kernel/debug/tracing)生成fuse目录,对应fuse子系统 *//* _TRACE_FUSE_H尾缀与本头文件名fuse.h对应*/#if!/* fuse_lookup_pre_inode对应trace event函数名即通过trace_fuse_lookup_pre_inode可以调用本trace*/
2023-03-15 07:45:00
969
原创 fuse文件系统调试环境
qemu如何运行自己编译的kernel,请参考《linux调试专栏》的其他文章。meson configure --default-library static 配置静态编译。pip install pytest (编译fuse自测模块用到,可选,一般不需要)kernel编译后,qemu启动该kernel,会有/sys/fs/fuse目录。default_library选项,Current Value已经是static。(可选,fuse自测模块,一般不需要)4,编译fuse文件系统。
2023-03-06 20:45:00
2096
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅