📄 ͦ
字号:
any problems, send mails to sindybear@163.com
相关文件
/fs/iobuf.c
/fs/buffer.c
/mm/memory.c
/include/linux/iobuf.h
struct kiobuf
{
int nr_pages; //指示map_list数组中有多少个页
int array_len; //也就是maplist的长度。
int offset; /* Offset to start of valid data */
int length; //一次读写的长度,以byte计算。注意它表示全部的数据长度
struct page ** maplist; //所有的和这个kiobuf相关联的page都放在这个数组中
unsigned int locked : 1,
dovary : 1;
struct page * map_array[KIO_STATIC_PAGES];
struct buffer_head * bh[KIO_MAX_SECTORS]; //提供读写所需要的buffer_head
unsigned long blocks[KIO_MAX_SECTORS]; //标志读写的块号
atomic_t io_count;
int transferred; //
int errno;
void (*end_io) (struct kiobuf *);
void *end_io_data;
wait_queue_head_t wait_queue;
};
上面是kiobuf的结构,在一个kiobuf初始化的时候,调用kiobuf_init函数,将maplist指向map_array静态
指针数组,同时将array_len置为0。这个时候,map_array由于也是空的,其实整个kiobuf中没有任何的东西
************************使用方法********************************************
使用kiobuf进行读写的基本函数是blw_kiovec。这个函数的原型如下
int brw_kiovec(int rw, int nr, struct kiobuf *iovec[],
kdev_t dev, unsigned long b[], int size)
rw表示读写标志。
nr表示iovec中的kiobuf的数目
iovec表示kiobuf的指针数组。
dev表示要进行读写的设备。
b表示要进行读写的这个设备的块号的数组。
size表示要读写的设备的块大小(字节计数)
blw_kiovec的主要做的工作的过程是:它的核心结构就是一个三层循环。
第一层分别处理输入的iovec中的各个kiobuf。
第二层对于每一个kiobuf,先从中取出一个页面,作为读写的存放地。取出其中的length
第三层,按照length,按照b[]所指定的块进行读取。如果第二层取出的页用完了,length也没有完成,
就跳到第二层重新取出一个页面进行处理
****************************************************************************
**************************特别注意*********************************
使用brw_kiovec这个函数进行读写的时候,这个读写函数进行的异步的操作,
也就是直到数据都读写到指定的位置的时候,整个函数才会返回。这一点非常重要。
是许多系统保证数据一致性的重要前提
*******************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -