资讯专栏INFORMATION COLUMN

LINUX下进程打开的文件怎么和底层磁盘关联的?

lei___ / 1457人阅读

摘要:指向逻辑块号磁盘设备号存放的数据的逻辑块号,通过逻辑块号,就可以和磁盘关联起来了。通过以上结构体,可以得出一条线索磁盘块号或者磁盘块号磁盘的操作都是异步的,会通过特定的条件触发把内容从内存刷新到磁盘。

一直有个疑惑,文件是放在磁盘中的,但是操作文件却是在内存中,这两者是怎么关联的呢,虽然至今还没有找到更详细的答案,但是对linux底层数据结构进行梳理后,发现了其中的一些线索,与大家分享。

一、相关的linux数据结构 1. fd

在编程语言里面,打开一个文件一般的操作需要建立一个文件描述符fd:

int fd = open(...);

fd是一个int型,其实是一个数组的下标,前三个0,1,2被输入,输出,错误占用了

新建新的fd的时候,首先分配一个file对象,然后放到数组里面,返回这个数组的下标,就是fd了

2. file
struct file{
    file_operations *fop;
    path *f_path;
    loff_t f_pos;
}

file结构中有一个f_path指针,指向path结构,其中f_pos还保存了文件的位置

3. path
struct path{
    dentry *dentry
    ...
}

path连接着一个dentry结构

4. dentry
struct dentry{
    inode *d_inode;
    ...
}

dentry结构连接着inode结构

5. inode
struct inode{
    address_space *i_mapping;
    address_space *i_data;
}

inode结构连接着address_space结构

6. address_space
struct address_space{
    radix_tree_root page_tree;
}

page_tree是一个基树,节点中存放着page节点,page就是系统中的页,所以address_space连接着page结构。

7. page
struct page{
    void *private;
}

private指向buffer_head

8. buffer_head
struct buffer_head{
    sector_t block_nr; // 逻辑块号
    block_device *b_bdev; // 磁盘设备号
}

block_nr存放的数据的逻辑块号,通过逻辑块号,就可以和磁盘关联起来了。

9. bio
struct 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 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虚拟文件系统简介

    摘要:每个磁盘分区上都有一份,里面包含了当前磁盘分区的信息,如文件系统类型剩余空间等。首先得有一个创建文件系统的工具如文件系统的,用来将磁盘分区格式化成想要的格式,主要是初始化和。 本文将对Linux下的VFS做一个简单介绍,主要包括VFS里面的一些概念,以及文件系统是如何与VFS交互的。 本文所涉及的代码摘自Linux-4.4.0-59 什么是VFS VFS的全称为virtual File...

    paulquei 评论0 收藏0
  • linux文件读写浅析

    摘要:而如果文件打开时指定了选项,则表示绕开磁盘高速缓存,直接与通用块层打交道。既然上层的一次读写请求可能跨多个扇区,它也可能跨越磁盘高速缓存上的多个页。 转载linux内核响应一个块设备文件读写的层次结构如图(摘自ULK3): showImg(https://segmentfault.com/img/bVNWK1?w=296&h=427); 1、VFS,虚拟文件系统。 2、Disk Cac...

    Nosee 评论0 收藏0
  • vfs基础

    摘要:命令的一般形式为是设备名,是挂载点文件系统的基本结构是结构体与结构体。比如节点,与中都把文件管理结构称为,但实际上它们是不一样的。 转载 1 目录模型 2 VFS的概念 VFS是Linux中的一个虚拟文件文件系统,也称为虚拟文件系统交换层(Virtual Filesystem Switch)。它为应用程序员提供一层抽象,屏蔽底层各种文件系统的差异.如下图所示:showImg...

    bang590 评论0 收藏0
  • Linux内存管理

    摘要:虚拟内存虚拟内存是管理内存的一种技术。而实际的物理内存可能远远小于虚拟地址空间的大小。进程和的虚拟内存是相互独立的,且也是独立的,它们之间共享物理内存。 在linux下,使用top,vmstat,free等命令查看系统或者进程的内存使用情况时,经常看到buff/cache memeory,swap,avail Mem等,他们都代表什么意思呢?这篇文章将来聊一聊Linux下的内存管理并解...

    Yu_Huang 评论0 收藏0
  • Android从开机到打开第一个应用发生了什么?

    摘要:但是会对其做相应的限制,同时可能会对一些进程进行限制,限制给进程分配多少个文件描述符。 本人现在每日一道算法题的Github地址。https://github.com/Jensenczx/...附带OJ地址和本人的代码博客新址,这里更有趣 序言 昨日阿里二面,跪的很惨,项目,算法,计算机基础不问,问Linux内核,我是投的android实习岗,要求是对于android底层有很深厚的基础...

    JaysonWang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<