【eBPF】BCC跟踪内核调度切换

admin 2024年2月17日21:25:09评论12 views字数 1344阅读4分28秒阅读模式
【eBPF】BCC跟踪内核调度切换

免责声明

【eBPF】BCC跟踪内核调度切换

本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号不为此承担任何责任。

【eBPF】BCC跟踪内核调度切换

内核调度切换

【eBPF】BCC跟踪内核调度切换
调度切换(schedule switch),也被称作上下文切换(context switch),是指操作系统的调度器停止一个进程或线程的执行并启动另一个进程或线程的执行的过程。在多任务操作系统中,这使得多个进程可以在同一个处理器上“同时”运行,实际上是操作系统在它们之间快速切换,给出同时运行的效果。
调度切换通常涉及以下步骤:
  1. 保存当前执行任务的状态(寄存器、程序计数器、栈等)。
  2. 更新任务状态信息(内存管理信息、调度信息等)。
  3. 选择下一个要执行的任务。
  4. 加载新任务的上下文到处理器中。
  5. 开始执行新的任务。
这个过程是由操作系统内核中的调度器管理的,它决定哪个进程或线程应该获得CPU时间,在多进程环境下保证系统的响应性和效率。

BCC作为一个流行的ebpf开发方案,提供了很多案例供开发者学习,其中/examples/tracing/task_switch.c是BCC官方提供的过滤HTTP请求的案例。过滤HTTP请求对于入侵检测和免杀木马(后面会重点讲解)很有帮助,值得学习。

【eBPF】BCC跟踪内核调度切换

【eBPF】BCC跟踪内核调度切换

内核态代码

【eBPF】BCC跟踪内核调度切换
  1.  创建一个记录调度切换的哈希表,键为key_t记录了前一个进程pid和后一个进程pid,值为无符号整数;

struct key_t {    u32 prev_pid;    u32 curr_pid;};BPF_HASH(stats, struct key_t, u64, 1024);

2. 完成将由内核在调度事件发生时触发的核心函数count_sched,获取当前的pid和切换前的pid,记录在哈希表中:

int count_sched(struct pt_regs *ctx, struct task_struct *prev) {    struct key_t key = {};    u64 zero = 0, *val;    key.curr_pid = bpf_get_current_pid_tgid();    key.prev_pid = prev->pid;    // could also use `stats.increment(key);`    val = stats.lookup_or_try_init(&key, &zero);    if (val) {        (*val)++;    }    return 0;}
【eBPF】BCC跟踪内核调度切换

用户态代码

【eBPF】BCC跟踪内核调度切换
  1. 创建BPF对象,把我们的内核态代码附加到内核中调用切换有关的函数里:

b = BPF(src_file="task_switch.c")b.attach_kprobe(event_re=r'^finish_task_switch$|^finish_task_switch.isra.d$',                fn_name="count_sched")

2. 在等待短暂时间后,打印等待期间的内核调用情况:

# generate many schedule eventsfor i in range(0, 100): sleep(0.01)for k, v in b["stats"].items():    print("task_switch[%5d->%5d]=%u" % (k.prev_pid, k.curr_pid, v.value))
【eBPF】BCC跟踪内核调度切换

执行效果

【eBPF】BCC跟踪内核调度切换

【eBPF】BCC跟踪内核调度切换

原文始发于微信公众号(赛博安全狗):【eBPF】BCC跟踪内核调度切换

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月17日21:25:09
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【eBPF】BCC跟踪内核调度切换http://cn-sec.com/archives/2500352.html

发表评论

匿名网友 填写信息