1.iov_iter的定义 iov_iter结构体通常定义为: c复制代码 struct iov_iter { int type; /* Type of iter */ size_t pos; /* Offset to current iter */ size_t count; /* Count of bytes not yet iterated */ size_t nbytes; /* Total number of bytes in the iter */ union { struct { vo...
struct iov_iter 是一种 Linux 内核数据结构,表示遍历内存块的各种方式,包括 struct iovec。在我们的例子中,它将指向 128KiB 的缓冲区。vmsplice 使用 iov_iter_get_pages 将输入缓冲区转换为一组 struct pages,并保存它们。既然已经知道了分页的工作原理,你可以大概想象一下 iov_iter_get_pages 是如何工作的,下...
I/O 向量是一种用于表示不连续内存区域的数据结构, //struct iov_iter 提供了迭代和遍历这些向量的方法。 struct iov_iter iter; ssize_t ret; //初始化上述的结构体 init_sync_kiocb(&kiocb, filp); kiocb.ki_pos = *ppos; iov_iter_init(&iter, WRITE, &iov, 1, len); //调用write_iter(sock_...
ssize_t (*write) (structfile*,constchar__user*,size_t,loff_t*); ssize_t (*read_iter) (structkiocb*,structiov_iter*); ssize_t (*write_iter) (structkiocb*,structiov_iter*); int (*iterate) (structfile*,structdir_context*); int (*iterate_shared) (structfile*,structdir_context*);...
(*write_iter)(struct kiocb*,struct iov_iter*);int(*iterate)(struct file*,struct dir_context*);int(*iterate_shared)(struct file*,struct dir_context*);__poll_t(*poll)(struct file*,struct poll_table_struct*);long(*unlocked_ioctl)(struct file*,unsigned int,unsigned long);long(*compat_...
比如下面在 Buffered IO 模式下进行文件写入的时候,在下图中的第四步,内核会调用 iov_iter_copy_from_user_atomic 函数将用户空间缓冲区 DirectByteBuffer 中的待写入数据拷贝到 page cache 中。 但是内核又不能直接进行拷贝,因为此时从 page cache 中取出的缓存页 page 是物理地址,而在内核中是不能够直接操作物理...
struct iovec iov = { .iov_base = buf, .iov_len = len }; //函数中kiocb表示io control block. 用来跟踪记录IO操作的完成状态 struct kiocb kiocb; //iov_iter表示用户和内核之间传递的数据 struct iov_iter iter; ssize_t ret; init_sync_kiocb(&kiocb, filp); ...
调用iov_iter_copy_from_user_atomic,将写入的内容从用户态拷贝到内核态的页中; 调用address_space的write_end完成写操作; 调用balance_dirty_pages_ratelimited,看脏页是否太多,需要写回硬盘。所谓脏页,就是写入到缓存,但是还没有写入到硬盘的页面。 对于第一步,调用的是ext4_write_begin来说,主要做两件事: ...
- 17.08% 0.17% write [kernel.kallsyms] [k] iov_iter_get_pages - 16.91% iov_iter_get_pages - 16.88% internal_get_user_pages_fast 11.22% try_grab_compound_head get_user_pages_fast 是 iov_iter_get_ pages 的简化版本: int get_user_pages_fast( ...
ext4_file_read_iter会调用generic_file_read_iter,ext4_file_write_iter会调用__generic_file_write_iter。 ssize_t generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter) { ... if(iocb->ki_flags & IOCB_DIRECT) { ... struct address...