内核中很多地方都用到了这个数据结构,它主要用于处理一个或多个数据块。
结构体定义
struct iov_iter {
u8 iter_type;
bool nofault;
bool data_source;
size_t iov_offset;
size_t count;
union {
const struct iovec *iov;
const struct kvec *kvec;
const struct bio_vec *bvec;
struct xarray *xarray;
struct pipe_inode_info *pipe;
};
union {
unsigned long nr_segs;
struct {
unsigned int head;
unsigned int start_head;
};
loff_t xarray_start;
};
};
iter_type
表明当前的数据块类型, 这个结构支持各种类型的数据块(ITER_IOVEC、
ITER_KVEC、ITER_BVEC、ITER_PIPE、ITER_XARRAY)
nofault
处理页数据块时的一个标志位。
data_source
表示数据的方向,即write/read, 是从当前结构的用户的角度来说的,比如:当udp
socket发送数据到内核,需要将数据copy到这个结构中,就是write.
iov_offset
多个数据块是存放在一个指针数组是的,数组的一个元素指向一个数据块,而iov_offset就是数组第一个元素指向的数据块中的偏移。
iov
结构体指针数组,数组每一个元素指向一个struct iovec结构体,这是联合体的一个成员,其它几个也是类似,与iter_type对应。
nr_segs
指示上述数组的大小,也是一个联合体成员,另外两个分别对应ITER_PIPE、ITER_XARRAY两种类型的。