有很多人和我有同样的疑问吗? 文件在磁盘上,但操作文件在内存中。 这两者有什么联系呢? 到现在为止还没有找到更详细的答案,但是整理了linux基础的数据结构后,发现了一些线索。 和大家分享。
一、相关linux数据结构
1 .软盘
在编程语言中,打开文件的常见操作需要创建文件描述符软盘。
intFD=open(…;
软盘为int型,实际上是数组的下标,前三个0、1、2被输入、输出、错误占用
创建新软盘时,首先分配file对象,将其放入数组中,然后返回此数组的后缀,这就是软盘
2 .文件
结构文件{
file_operations *fop;
path *f_path;
loff_t f_pos;
}
file结构具有指向path结构的f_path指针。 其中,f_pos还保存文件的位置
3. path
结构路径{
登特里*登特里
.
}
path与dentry结构连接
4 .登特里
结构目录{
inode *d_inode;
.
}
dentry结构连接到I节点结构
5 .节点
结构索引{
地址_ space * I _ mapping;
地址_ space * I _ data;
}
inode结构体连接到address_space结构体
6 .地址_空间
结构地址_ space {
radix_tree_root page_tree;
}
page_tree是基本树,节点包含page节点,page是系统中的页面,因此address_space连接到page结构。
7. page
结构页面{
Void *隐私;
}
私有指向buffer_head
8. buffer_head
结构缓冲器_ head {
sector_t block_nr; //逻辑块编号
block_device *b_bdev; //磁盘设备编号
}
保存在block_nr中的数据的逻辑块编号可以通过逻辑块编号与磁盘相关联。
9. bio
结构bio {
bio_vec*bi_io_vec; //链表
sector_t bi_sector; //磁盘上的相关扇区
struct block_device *bi_bdev; //相关的块设备
}
一个bio连接到n个bio_vec结构,用于表示内容在page中的位置
10. bio_vec
struct bio_vec{
page *bv_page; //指向包含的页面
int bv_len; //长度
int bv_offset; //页面中的偏移量
}
11. task_struct
结构任务_结构{
struct bio *bio_list; 指向//BIO的链表头
}
二.读写操作
file的file_operations是包含对文件的读取、写入等操作的操作结构,对文件的所有操作都将转移到该文件的file-f_op-read/write等操作中。
三.内存到磁盘的路径
从linux2.6开始,使用bIO的结构来描述IO操作。 为了提高效率,使用buffer_head的场景较少,使用bio结构编写读/写操作,并使用io调度算法进行调度。
从以上结构体可以得到线索。
软盘-文件路径-目录-索引节点-地址_空间-页面-缓冲区_头-磁盘块编号
或者
task_struct-bio-磁盘块编号
的所有IO操作都是异步的,并且内容会根据特定条件从内存刷新到磁盘。
本作品的采用
知识共享签名-允许非商业使用4.0国际许可协议。