io_uring学习笔记


回顾IO方式

基于 fd 的阻塞式 I/O:read()/write()

非阻塞式 I/O:select()/poll()/epoll()

线程池方式

Direct I/O(数据库软件):绕过 page cache

异步 IO(AIO)

相关数据结构

io_uring有三个相关的系统调用API:

  • io_uring_setup(2)
  • io_uring_register(2)
  • io_uring_enter(2)

io_uring的相关数据结构主要有两个单向环形队列:

1744370259243

在内核当中使用 io_uring 结构体来保存单个环形队列的 head 与 tail,head 用于出队而 tail 用于入队,head == tail 时队列为空:

1744371851962

1744372295318

syscall

io_uring_setup

用于创建io_uring上下文,模板如下:

#include <liburing.h>
int main(){
struct io_uring ring;
int ret = io_uring_queue_init(4, &ring, 0);
if (ret < 0) {
perror("io_uring_queue_init");
return -1;
}
}

编译命令:(不要忘记加-luring编译选项)

gcc -fno-stack-protector -o test e2.c --static -masm=intel -luring

io_uring_register()

操作用于异步 I/O 的缓冲区;

参考

https://arthurchiao.art/blog/intro-to-io-uring-zh/

https://arttnba3.cn/2021/11/29/PWN-0X02-LINUX-KERNEL-PWN-PART-II/#0x0C-io-uring-%E4%B8%8E%E5%BC%82%E6%AD%A5-IO-%E7%9B%B8%E5%85%B3


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