熊喵君的博客

Thinking will not overcome fear but action will.

Linux 内核之旅(九):OverlayFS

0x00 前言 0x01 overlayFS 基础 OverlayFS是一种堆叠文件系统,它依赖并建立在其它文件系统(如ext4fs/xfs等)之上,并不直接参与磁盘空间结构的划分,仅仅将原来底层文件系统中不同的目录进行(策略式)合并,然后向用户呈现。对于用户来说,它所见到的overlay文件系统根目录下的内容就来自挂载时所指定的不同目录按策略合并之后的结果,挂载文件的基本命令...

Linux 内核之旅(八):内核数据包接收

基础知识汇总

0x00 前言 笔者最近在研究基于ebpf的网络协议栈可观测及tracing,本文对协议栈的数据处理基础做了若干总结 本文代码基于 v4.11.6 版本 0x01 网卡的报文接收过程 一些背景知识: 网卡驱动是加载到内核中的模块,负责衔接网卡和内核的网络模块,驱动在加载的时候将自己注册进网络模块,当相应的网卡收到数据包时,网络模块会调用相应的驱动程序处理数据 本...

Linux 内核之旅(七):虚拟内存管理(下)TODO

内核视角的虚拟内存管理

0x00 前言 0x0 参考 4.6 深入理解 Linux 虚拟内存管理 4.7 深入理解 Linux 物理内存管理 mmap 源码分析 linux源码解读(十六):红黑树在内核的应用——虚拟内存管理 图解 Linux 虚拟内存空间管理

Linux 内核之旅(六):进程调度(CFS)

0x00 前言 本文学习下CFS调度算法(Completely Fair Scheduler,完全公平调度器)用于Linux系统中普通进程的调度,CFS调度器的目标是让所有普通进程的vruntime尽可能接近,实现公平的调度。CFS的设计理念是在真实硬件上实现理想的、精确的多任务CPU。CFS调度器和先前内核版本调度器不同之处在于没有时间片的概念,而是分配cpu使用时间的比例,若2个相...

Linux 内核之旅(五):内核的可观测

内核追踪的工具入门:ftrace/bpftrace/perf

0x00 前言 追踪类调试工具鸟瞰图 0x01 ftrace 工作原理 Ftrace的框架图如下,ftrace包括多种类型的tracers,每个tracer完成不同的功能,将这些不同类型的tracers注册进入ftrace framework,各类tracers收集不同的信息,并放入到Ring buffer缓冲区以供调用 从上图可知,Ftrace是基于debugfs...

Linux 内核之旅(四):进程调度基础

进程调度的大白话

0x00 前言 Linux进程调度的本质是,在有限CPU下(进程数目远远超过CPU的数目)需要依据某种算法调度进程,有效地分配CPU的时间,既要保证进程的最快响应,也要保证进程之间的公平 0x01 进程调度基础知识 CPU视角 本小节描述下CPU视角下的CPU的工作机制,思考这个问题,CPU是如何在用户程序之间、内核代码与用户程序之间切换的?从CPU视角来看,是如何访问task...

EBPF 内核态代码学习(三):一个 XDP ACL系统实现

基于ebpf技术实现的XDP应用分析

0x00 前言 oxdpus是一个基于XDP技术实现的包过滤项目,支持下面指令: add Appends a new IP address to the blacklist attach Attaches the XDP program on the specified device detach Removes the XDP pro...

Linux HIDS 开发场景收集

0x00 场景收集 如何根据task_struct结构,获取到事件对应运行二进制的绝对路径? 如何获取进程打开的文件fd列表? 如何根据进程打开的文件fd列表,并且判断其是否为socket网络句柄? 如何根据task_struct结构,获取该进程对应的进程链信息(类似pstree)? 如何获取某个进程(task_struct)对应的socket五元组信息(如果打...

Linux 内核之旅(二):VFS

0x00 前言 Linux 支持多种文件系统格式(如 ext2、ext3、reiserfs、FAT、NTFS、iso9660 等),不同的磁盘分区或其它存储设备都有不同的文件系统格式,然而这些文件系统都可以 mount 到某个目录下,使开发者看到一个统一的目录树,各种文件系统上的目录和文件,读写操作用起来也都是一样的。Linux 内核在各种不同的文件系统格式之上做了一个抽象层,使得文件...

EBPF 内核态代码学习(一):进程调度延时计算

runqslower/runqlat 等CPU性能工具实现分析

0x00 前言 调度延迟是指一个任务task_struct具备运行的条件(进入 CPU 的 runqueue),到真正执行(获得 CPU 的执行权)的这段等待调度的时间。延迟是因为 CPU 还被其他任务占据,而且可能还有其他在 runqueue 中排队的任务(见前文),排队的任务越多,调度延迟就可能越长,所以这也是间接衡量 CPU 负载的一个指标(CPU 负载通过计算各个时刻 runq...