percpu_ref_data学习笔记


基本信息

percpu_ref_data

kmalloc-64

源码路径:https://elixir.bootlin.com/linux/v5.15/source/include/linux/percpu-refcount.h#L95

分配点:io_ring_ctx_alloc()->percpu_ref_init()

API: io_uring_setup分配,close释放;

源码回溯

https://elixir.bootlin.com/linux/v5.15/source/fs/io_uring.c#L10390

调用链很长:

__do_sys_io_uring_setup
io_uring_setup
io_uring_create
io_ring_ctx_alloc
per_cpu_ref_init

实操&调试

回顾笔者有关io_uring的学习笔记,相关代码如下:

#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <stdint.h>
#include <errno.h>

#define SYS_io_uring_setup 425

struct io_uring_params {
__u32 sq_entries;
__u32 cq_entries;
__u32 flags;
__u32 sq_thread_cpu;
__u32 sq_thread_idle;
__u32 features;
__u32 wq_fd;
__u32 resv[3];
__u64 sq_off[6];
__u64 cq_off[6];
};

int main() {
struct io_uring_params p;
memset(&p, 0, sizeof(p));

// 最小化设置:8个SQ和CQ队列项
int ring_fd = syscall(SYS_io_uring_setup, 8, &p);
if (ring_fd < 0) {
perror("io_uring_setup failed");
return 1;
}

printf("io_uring_setup succeeded, ring fd: %d\n", ring_fd);

// 最后记得关闭
close(ring_fd);
return 0;
}

参考

https://bsauce.github.io/2022/07/26/CVE-2022-34918/


文章作者: q1ming
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 q1ming !
  目录