熊喵君的博客

Thinking will not overcome fear but action will.

Linux 内核之旅(二十四):内核视角下的IO读写(四)

Linux IO模型 && 内核视角下的写流程

0x00 前言 本文以ext4为例,基于v4.11.6的源码来分下page cache机制下write写入过程的内核实现(不涉及块设备层) 0x01 内核写(write)实现 const struct file_operations ext4_file_operations = { ...... .write_iter = ext4_file_write_iter, //...

Linux 内核之旅(二十二):内核视角下的IO读写(三)

内核视角下的读文件过程(续)

0x00 前言 先回顾一下,调用read系统调用之后,内核的调用路径是什么? 0x01 generic_file_read_iter的实现细节 通常大部分文件系统的读取read实现,都是将read_iter置为generic_file_read_iter,如本文分析的ext4系统 //https://elixir.bootlin.com/linux/v4.11.6/so...

VFS hooks

文件相关的监控点梳理

0x00 前言 本文代码基于: 内核v5.4.241 内核v6.6 0x01 文件操作函数 chmod相关 chmod/fchmodat->do_fchmodat->chmod_common SYSCALL_DEFINE3(fchmodat, int, dfd, const char __user *, filename, umode_t, mod...

Linux 内核之旅(二十一):page cache

内核中的page cache管理

0x00 前言 本文主要梳理下page cache与管理的若干知识,本文基于v4.11.6的源码 页高速缓存(page cache),它是一种对完整的数据页进行操作的磁盘高速缓存,即把磁盘的数据块缓存在页高速缓存中。page cache是内核为文件创建的内存缓存,用以加速相关的文件操作。当应用程序需要读取文件中的数据时,操作系统先分配一些内存,将数据从存储设备读入到这些内存中,然后再...

Linux 内核之旅(二十):内核视角下的共享内存

mmap与shm在内核的实现分析与区别

0x00 前言 共享内存主要用于进程间通信,常见Shared Memory机制: System V shared memory(shmget/shmat/shmdt):旧 POSIX shared memory(shm_open/shm_unlink):新 此外,内存映射mmap机制也可以用于跨进程间通信,参考前文:虚拟内存管理(上),当然了mmap也支持私有映射 ...

Linux 内核CVE:CVE-2022-0847

Linux 内核 DirtyPipe 任意只读文件覆写漏洞分析

0x00 前言 前文Linux 内核之旅(十五):管道的实现介绍了管道机制的内核实现原理,本文学习一个基于管道机制的非常有趣的CVE实现:CVE-2022-0847 本文基于漏洞影响版本v5.13来进行分析 0x01 CVE介绍 相关的poc代码参考此,抽象为如下代码结构,这里面包含的五个步骤缺一不可 // 1、创建管道 int p[2]; pipe(p); // 2、填...

Linux 内核之旅(十七):Linux Namespace

PidNamespace And MntNamespace

0x00 前言 命名空间用来实现内核对资源进行隔离,本文基于v4.11.6的源码分析下Mnt Namespace的若干细节 0x01 一个容器的case 几个问题: 容器内的进程pid的分配过程 容器(容器内进程)创建的过程,pivot_root/chroot的区别 容器内挂载树(mount tree)的生成过程 0x02 pidnamespace:容器内进程...

Linux 内核之旅(十六):内核视角下的IO读写(一)

基础知识 && 数据结构 && IO基础概念

0x00 前言 IO过程的性能开销 1、网络包接收流程中的性能损失 应用程序通过系统调用(如recv/read等)从用户态转为内核态的开销以及系统调用返回时从内核态转为用户态的开销 网络数据从内核空间通过CPU拷贝到用户空间的开销 内核线程ksoftirqd响应软中断的开销 CPU响应硬中断的开销 DMA拷贝网络数据包到内存中的开销 2、网络包发送流程中...

Linux 内核之旅(十五):管道的实现

有名/匿名管道实现原理:内核视角下的数据流转

0x00 前言 这篇文章来源于对一个问题的思考:Linux中两个进程通过有名(mkfifo)或者匿名(pipe)管道进行通信时,在这两个进程的内核VFS视图中,数据是如何流转的?代码基于 v4.11.6 版本 前置基础: 数据结构与算法回顾(四):环形内存缓冲区 ringbuffer 管道 管道应用场景: zero copy 进程间通信,又分匿名(pipe)与有名...

bpftrace 常用code收集

0x00 前言 本文的bpftrace工具版本:bpftrace v0.19.1 bpftrace语法 bpftrace语法(类似awk),{前的部分相当于awk中的condition,{}中的部分相当于awk的action,不过bpftrace执行actions的条件是触发probe名称指定的事件 probe的格式为namespace:function_name,如tracepo...