- 博客(67)
- 收藏
- 关注
原创 Sched ext回调3——select_cpu(linux 6.15.7)
本文分析了Linux调度器扩展(sched_ext)中的select_cpu回调机制。主要探讨了该回调在任务唤醒(wake_up)和执行(exec)两种场景下的调用流程:1) 在任务唤醒时通过select_task_rq_scx调用select_cpu选择目标CPU;2) 在exec系统调用时处理任务迁移。文章详细说明了p->wake_cpu字段的作用机制,以及如何在调度器扩展中利用该字段优化任务迁移。同时解析了select_cpu回调的设计意图和使用限制,包括其对空闲CPU的唤醒机制、与DSQ队列的
2026-02-05 12:10:57
634
原创 Sched ext回调2——enable(linux 6.15.7)
struct sched_ext_ops代表了一个调度器,里面定义了很多,本文分析enable这个hook,sched ext的部分hook如下:enable 函数仅在 task 被sched ext调度器接管时才会触发;而 init_task 函数则无论 task 是否被 sched ext 调度器接管,都会被触发。
2026-01-27 17:30:00
1413
原创 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
848
原创 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
1028
原创 Sched ext回调3——running(linux 6.15.7)
本文摘要介绍了Linux内核调度器ext_sched_class的实现细节,重点分析了__schedule()调用链如何通过pick_next_task()最终执行ext_sched_class的running回调函数。
2025-11-25 10:26:24
298
原创 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
902
原创 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
290
原创 虚机安装及一些基本操作
先下载虚机配置文件geshifei-vm1.xml:链接: https://pan.baidu.com/s/15wXohrZxFti4NwmK8XEyIg 提取码: 1234注意,这只是从 libvirt 的数据库里去掉了这台虚机,虚机的磁盘文件还在,如果确认不用了,可以通过“六”节将磁盘文件也删除。
2025-10-21 17:52:33
961
原创 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
969
原创 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
822
原创 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
847
原创 运行sched_ext调度器
系统信息Linux内核从6.12版本开始正式支持sched_ext调度程序,所以需升级内核至6.15.7或其他高版本。
2025-08-15 15:31:30
1002
原创 调度器类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
445
原创 eBPF的helper函数
helper函数,是内核提供给 eBPF 程序调用的辅助函数。eBPF 程序本身是个小型沙盒程序,不能直接访问内核的所有资源。这些helper函数是内核预先实现的,可以让eBPF程序完成复杂功能,而不用自己写复杂的代码。
2025-08-13 10:17:06
124
原创 eBPF简明使用教程
编译生成bpf可执行程序bpf_program.o和加载器bpfload。从upstream或者欧拉社区,下载对应版本的内核源码,并mv到根目录。修改helloword中的loader.c源码,增加如下。
2025-08-06 20:26:36
76
原创 如何通过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
1070
原创 bcache的基本操作
1,停止bcache设备lsblk<====停止前,存在bcache0设备#停止bcache设备lsblk<===没有bcache0设备了2,擦除backingdevice上的superblock信息3,按4k大小格式化backingdevice。
2025-01-20 10:37:31
1432
原创 ubuntu20.04 调试bcache源码
搭建单步调试bcache的环境,/dev/sdb作为backing dev, /dev/sdc作为cache dev。
2024-12-25 23:49:29
1308
原创 TwinCAT3 实时核中ADS实现C++ server、clinet数据传输
Automation Device Specification,ADS设备间进行通信的协议规范。协议定义了ADS device之间如何寻址对方、ADS device之间可以执行哪些操作、执行这些操作需要哪些参数,以及操作完成后如何返回结果等。
2024-09-10 22:00:00
2402
原创 Twincat ADS 报文分析(Sum Write)
或者网盘下载:链接:https://pan.baidu.com/s/188GY9zuIrDFMXiTqky4MWg提取码:a9k2抓包工具安装在ADS通讯的机器上,比如我的环境:在开发机中编写一个模块A、B通讯的程序,然后下载到工控机中,那么抓包工具需要安装在工控机上(而不是开发机上)。
2024-09-04 21:45:00
1301
原创 kasan排查kernel内存越界示例(linux5.18.11)
参考资料:1,内核源码目录中的Documentation\dev-tools\kasan.rst2,
2024-03-07 17:19:17
1794
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
2374
原创 Ethercat“BWR配置从站地址”报文分析(0x0010:0x0011)
涉及的从站寄存器:Configured Station Address (0x0010:0x0010)。使用场景举例:IgH启动后,通过“配置从站地址”报文将所有从站地址清零,然后通过APWR指令+“配置从站地址”报文,设置各个从站的地址。
2023-12-23 18:29:41
1721
原创 Ethercat “BRD读从站状态”报文分析(0x0130:0x0131)
涉及的从站寄存器:Register AL Status 0x0130:0x0131。
2023-12-22 20:31:26
1724
1
原创 IgH调试注意事项
现象:虚拟机中运行IgH master并绑定网卡后,主站由ORPHANED状态转换成IDLE状态,但无法收发数据报。这是因为虚拟机用的是虚拟网卡,需通过iptables将数据包到转发到真实的网卡上,实现收发数据的目的。但IgH替换了网卡驱动程序,收到数据包后,处理流程没有走内核的网络协议栈,所以工作中tcp/ip层的iptables就不起作用,导致IgH无法正常收发报文。解决:物理机安装ubuntu用来测试IgH。
2023-12-21 19:48:30
1660
1
原创 IgH Master环境搭建
在ubuntu20.04中搭建一个IgH主站。目标:实时linux内核中运行IgH主站,ethercat的用户态工具能看到主站信息。
2023-11-17 13:09:08
1543
原创 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
4774
2
原创 android存储3--初始化.unlock事件的处理
SystemServiceManager收到unlock事件后,遍历service链表,依次执行各个service的onUserUnlocking,对于存储service,执行的是StorageManagerService$Lifecycle中的onUserUnlocking,在这个方法中,存储的StorageSessionController、vold、storaged模块进行各自初始化操作。
2023-06-22 17:38:41
2608
原创 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
1545
原创 android存储1--初始化.清理环境
开机后,StorageManagerService收到开机广播消息H_BOOT_COMPLETED,按时间顺序完成以下5件事情:代码整体逻辑如下: 代码路径:StorageManagerServiceHandler::handleMessage --> handleBootCompleted --> initIfBootedAndConnected分两种情况:1)用户目录采用硬件加解密(native encryption),此阶段什么事也不做,函数直接返回2)用户目录采用软件加解密(enmulated
2023-04-18 12:42:48
1750
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
346
原创 StorageManagerService.java中的mVold.mount
StorageManagerService.java中的mVold.mount
2023-04-07 22:01:21
987
原创 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
944
原创 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
2078
原创 win10搭建android monkeyrunner自动化测试环境
本文记录一下monkeyrunner环境搭建遇到的各种坑,以免以后再次踩坑。首先要提一下巨坑,务必要安装java 8(本文记录于2023.3),安装其他版本java,运行monneyrunner会有很多问题,见第七节。
2023-03-02 15:41:14
1634
11
原创 ubuntu20.04 搭建kernel调试环境第五篇--命令行调试kernel
前一篇文章介绍了eclipse图形化调试kernel,操作比较繁琐。这篇文章介绍gdb命令行方式,更为简单。
2022-12-12 14:28:50
1020
原创 ubuntu20.04 搭建kernel调试环境第四篇--图形化调试kernel
1)官网下载对应的版本(eclipse-inst-jre-linux64.tar.gz)2)解压3)进入解压后的eclipse-installer目录,运行安装程序4)运行eclipse5)安装CDTHelp --> Eclipse Marketplace,搜索“cdt”,安装Bracketeer for C/C++(CDT)二、编译rootfs及kernel iamge参考,制作rootfs。参考,编译kernel image。三、配置eclipse远程调试kernel。
2022-12-12 14:18:05
1235
原创 ubuntu20.04 搭建kernel调试环境第六篇(下)-网络原理
ubuntu中qemu启动多个guest虚拟机,guest如何访问外网?guest之间如何实现网络通信?我常用qemu调试自己编译的kernel,需要在guest和host之间共享一些调试文件,如何达到这个目的?开发人员经常遇到环境差异(ubuntu宿主机、自己编译的kernel config、rootfs、qemu等等因素)导致"别人成功的经验”不能复制到自己机器上,所以有必要深入了解一下qemu的网络是怎么实现的,遇到问题才能快速解决。参考ubuntu20.04 搭建kernel调试环境第四篇--网络
2022-12-06 17:44:41
886
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅