⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ͦ

📁 linux内核学习笔记 希望想看的人可以很快下载到
💻
字号:
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 + -