摘要:指向逻辑块号磁盘设备号存放的数据的逻辑块号,通过逻辑块号,就可以和磁盘关联起来了。通过以上结构体,可以得出一条线索磁盘块号或者磁盘块号磁盘的操作都是异步的,会通过特定的条件触发把内容从内存刷新到磁盘。
一直有个疑惑,文件是放在磁盘中的,但是操作文件却是在内存中,这两者是怎么关联的呢,虽然至今还没有找到更详细的答案,但是对linux底层数据结构进行梳理后,发现了其中的一些线索,与大家分享。
一、相关的linux数据结构 1. fd在编程语言里面,打开一个文件一般的操作需要建立一个文件描述符fd:
int fd = open(...);
fd是一个int型,其实是一个数组的下标,前三个0,1,2被输入,输出,错误占用了
新建新的fd的时候,首先分配一个file对象,然后放到数组里面,返回这个数组的下标,就是fd了
2. filestruct file{ file_operations *fop; path *f_path; loff_t f_pos; }
file结构中有一个f_path指针,指向path结构,其中f_pos还保存了文件的位置
3. pathstruct path{ dentry *dentry ... }
path连接着一个dentry结构
4. dentrystruct dentry{ inode *d_inode; ... }
dentry结构连接着inode结构
5. inodestruct inode{ address_space *i_mapping; address_space *i_data; }
inode结构连接着address_space结构
6. address_spacestruct address_space{ radix_tree_root page_tree; }
page_tree是一个基树,节点中存放着page节点,page就是系统中的页,所以address_space连接着page结构。
7. pagestruct page{ void *private; }
private指向buffer_head
8. buffer_headstruct buffer_head{ sector_t block_nr; // 逻辑块号 block_device *b_bdev; // 磁盘设备号 }
block_nr存放的数据的逻辑块号,通过逻辑块号,就可以和磁盘关联起来了。
9. biostruct bio{ bio_vec *bi_io_vec; // 链表 sector_t bi_sector; // 磁盘上相关的扇区 struct block_device *bi_bdev; // 相关的块设备 }
一个bio连接着n个bio_vec结构,用于表示page中内容的位置
10. bio_vecstruct bio_vec{ page *bv_page; // 指向包含的页 int bv_len; // 长度 int bv_offset; //页中的偏移 }11. task_struct
struct task_struct{ struct bio *bio_list; // 指向bio的链表头 }二、读写操作
file中的file_operations是一个操作结构,里面包含对文件的read,write等操作,所有对文件的操作,都会转移到该文件file->f_op->read/write等操作。
三、内存到磁盘的路径linux2.6之后,使用了bio的结构来描述IO操作,由于效率的原因,所以buffer_head使用场景变少了,用bio结构描述一个读/写操作,然后使用IO调度算法进行调度。
通过以上结构体,可以得出一条线索:
fd->file->path->dentry->inode->address_space->page->buffer_head->磁盘块号
或者
task_struct->bio->磁盘块号
磁盘的IO操作都是异步的,会通过特定的条件触发把内容从内存刷新到磁盘。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/33733.html
摘要:每个磁盘分区上都有一份,里面包含了当前磁盘分区的信息,如文件系统类型剩余空间等。首先得有一个创建文件系统的工具如文件系统的,用来将磁盘分区格式化成想要的格式,主要是初始化和。 本文将对Linux下的VFS做一个简单介绍,主要包括VFS里面的一些概念,以及文件系统是如何与VFS交互的。 本文所涉及的代码摘自Linux-4.4.0-59 什么是VFS VFS的全称为virtual File...
摘要:而如果文件打开时指定了选项,则表示绕开磁盘高速缓存,直接与通用块层打交道。既然上层的一次读写请求可能跨多个扇区,它也可能跨越磁盘高速缓存上的多个页。 转载linux内核响应一个块设备文件读写的层次结构如图(摘自ULK3): showImg(https://segmentfault.com/img/bVNWK1?w=296&h=427); 1、VFS,虚拟文件系统。 2、Disk Cac...
摘要:但是会对其做相应的限制,同时可能会对一些进程进行限制,限制给进程分配多少个文件描述符。 本人现在每日一道算法题的Github地址。https://github.com/Jensenczx/...附带OJ地址和本人的代码博客新址,这里更有趣 序言 昨日阿里二面,跪的很惨,项目,算法,计算机基础不问,问Linux内核,我是投的android实习岗,要求是对于android底层有很深厚的基础...
阅读 3362·2021-11-11 16:55
阅读 1480·2021-10-08 10:04
阅读 946·2021-10-08 10:04
阅读 3342·2021-09-27 13:36
阅读 2578·2019-08-30 15:53
阅读 1625·2019-08-30 11:17
阅读 1137·2019-08-29 16:55
阅读 1984·2019-08-29 13:57