• 操作系统文件使用磁盘的实现---20



    再一次使用磁盘,通过文件使用

    在这里插入图片描述
    当调用了sys_write系统调用进行磁盘写数据的时候,需要传入文件描述符号,内存缓冲区指针和读取字节个数。

    首先根据当前进程关联的flip (file pointer)表和fd下标查找到对应的file指针,然后根据file对象拿到当前文件对应的inode文件索引节点。

    最终调用file_write方法完成磁盘写操作,这里需要传入的参数不多介绍了,但是有小伙伴会有疑问,读写文件的位置不需要传入吗?

    其实读写文件的位置信息已经保存在了file对象中。


    file_write的工作过程应该就是…

    在这里插入图片描述
    如果我们要删除test.c文件200-212这段地址范围内的数据,那么首先需要根据file指针中fseek读写指针的位置确定要操作数据的相较于当前文件的起始偏移地址,然后根据count,确定操作数据的范围。

    有了操作数据的起始偏移地址,就可以根据inode中保存的当前文件对应的盘块号索引,计算出当前要操作的数据位于哪一个盘块中。

    然后由盘块号和buf等信息形成request请求,加入电梯队列中。


    file_write的实现

    在这里插入图片描述

    • 首先计算是对文件进行追加操作,还是读写当前文件读写指针所处的位置。
    • 通过pos计算出,当前要操作的数据位置对应的盘块号
    • 构造request请求,然后加入电梯队列,当前进程进入阻塞态
    • 当前要操作的数据可能跨域了多个盘块号,那么当上一次的磁盘读写请求完成后,进程被唤醒,然后接着去读取下一个盘块,直到所有盘块全部读取完毕

    create_block算盘块,文件抽象的核心

    while(i<count){ 
    //计算盘块号的核心方法
    block=create_block(inode, pos/BLOCK_SIZE);
    bh=bread(inode->i_dev, block);
    
    • 1
    • 2
    • 3
    • 4

    _bmap函数是计算盘块号的核心:

    //这里参数block传入的是逻辑数据库、块
    int _bmap(m_inode *inode, int block, int create){ 
    //(0-6):直接数据块
    if(block<7){ 
    if(create&&!inode->i_zone[block]){ 
    inode->i_zone[block]=new_block(inode->i_dev);
    inode->i_ctime=CURRENT_TIME; inode->i_dirt=1;
    }
    return inode->i_zone[block];
    }
    block-=7; 
    //(7):一重间接
    if(block<512){
    bh=bread(inode->i_dev,inode->i_zone[7]);
    return (bh->b_data)[block];
    } 
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    struct d_inode{ unsigned short i_mode;...
    unsigned short i_zone[9]; 
    //(0-6):直接数据块,(7):一重间接,(8):二重间接 }
    
    • 1
    • 2
    • 3

    在这里插入图片描述


    m_inode,设备文件的inode

    不光一个普通有数据的文件叫做文件,一个设备文件也叫做文件。

    如果是设备文件的话,不需要用inode完成映射关系,如果是普通文件的话,需要通过inode中存放的映射表,查找到当前读写文件的字符流位置到盘块号的映射。

    如果当前inode代表一个设备文件,那么inode中保存的应该是主设备号和次设备号。
    在这里插入图片描述
    如果是普通文件,那么inode中的i_zone数组中存放的应该是映射表信息,但是如果是设备文件的话,i_zone中存放的就是对应的主设备号和从设备号了。


    伟大的文件视图…

    在这里插入图片描述


  • 相关阅读:
    如何使用HTML制作个人网站( web期末大作业)
    js中的this举例介绍
    自定义View5 -塔防小游戏:第二篇防御塔随意放置
    java面试题_消息中间件--RabbitMQ(20题)
    OSPF路由策略引入
    海外代理IP与VPN有何区别?哪个更好?
    js对象获取属性的方法(.和[]方式)
    Jenkins-jenkins凭证管理与代码拉取
    电脑异常关机录屏/软件/程序异常停止/安卓手机/数据丢失找回方案
    手写数字识别--神经网络实验
  • 原文地址:https://blog.csdn.net/m0_53157173/article/details/126289516