Linux-0.11 文件系统file_dev.c详解

这篇具有很好参考价值的文章主要介绍了Linux-0.11 文件系统file_dev.c详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Linux-0.11 文件系统file_dev.c详解

模块简介

该文件主要提供了普通文件的读写方法file_readfile_write,这两个函数在系统调用_sys_read和sys_write中被调用。

函数详解

file_read

int file_read(struct m_inode * inode, struct file * filp, char * buf, int count)

该函数是文件读的函数。

首先定义了一些参数,这里不做介绍,下面用到时,再详解。

int left,chars,nr;
struct buffer_head * bh;

接着进行参数的校验, 如果入参count等于0, 代表不读任何数据,则直接返回0。

if ((left=count)<=0)
    return 0;

接下来,只要left值不为0,那么首先调用bmap函数(inode.c)获取当前文件指针指向的数据块磁盘上的位置nr(nr是绝对位置)。得到nr值之后,调用bread函数读取一个盘块的数据到bh块中。

while (left) {
    if ((nr = bmap(inode,(filp->f_pos)/BLOCK_SIZE))) {
        if (!(bh=bread(inode->i_dev,nr)))
            break;
    } else
        bh = NULL;

接下来计算文件指针指向的数据块中还剩下多少内容,将其和left相比,计算出两者较小值赋值给chars。接着将文件指针加上chars,将left减去chars。

nr = filp->f_pos % BLOCK_SIZE;
chars = MIN( BLOCK_SIZE-nr , left );
filp->f_pos += chars;
left -= chars;

接下来便开始本轮的文件读,调用put_fs_bytes拷贝数据到buf中。本轮读写之后,如果left不为0,则还会进入下一轮循环。

if (bh) {
    char * p = nr + bh->b_data;
    while (chars-->0)
        put_fs_byte(*(p++),buf++);
    brelse(bh);
} else {
    while (chars-->0)
        put_fs_byte(0,buf++);
}

程序运行到此,代表已经读完了要读的数据。最后修改了文件的atime属性。返回读取的字节数。

    inode->i_atime = CURRENT_TIME;//更新访问时间
    return (count-left)?(count-left):-ERROR;

file_write

int file_write(struct m_inode * inode, struct file * filp, char * buf, int count)

该函数是文件写的函数。

首先定义了一些参数,这里不做介绍,下面用到时,再详解。

    off_t pos;
    int block,c;
    struct buffer_head * bh;
    char * p;
    int i=0;

当flag中设置了O_APPEND参数时,将pos指针指向文件尾。否则指向当前文件指针的位置。

    if (filp->f_flags & O_APPEND)
        pos = inode->i_size;
    else
        pos = filp->f_pos;

接下来,当i小于count时进入循环,首先调用create_block从磁盘上获取一个逻辑块号,调用bread将磁盘块中的内容拷贝到bh中。

    while (i<count) {
        if (!(block = create_block(inode,pos/BLOCK_SIZE)))//该block是绝对位置
            break;
        if (!(bh=bread(inode->i_dev,block)))
            break;

对于当前的逻辑块,其已经写 pos % BLOCK_SIZE个字节, 其距离数据块的末尾还有(BLOCK_SIZE - c)个字节。

    c = pos % BLOCK_SIZE;  
    p = c + bh->b_data;
    bh->b_dirt = 1;
    c = BLOCK_SIZE-c;//当前数据块还剩多少空间
    if (c > count-i) c = count-i;
    pos += c;
    if (pos > inode->i_size) {
        inode->i_size = pos;
        inode->i_dirt = 1;
    }
    i += c;

最后调用get_fs_bytes指针将buf中的数据拷贝到bh块中。

    while (c-->0)
        *(p++) = get_fs_byte(buf++);
    brelse(bh);

程序的最后,更新i节点的m_time。如果本次操作不是在文件尾添加数据,则将读写指针调整到当前读写位置pos处。修改i节点的change time为当前时间。

    inode->i_mtime = CURRENT_TIME;
    if (!(filp->f_flags & O_APPEND)) {
        filp->f_pos = pos;
        inode->i_ctime = CURRENT_TIME;
    }

Q & A

1.i_atime/i_ctime/i_mtime的区别是什么?

i_atime:文件最后访问时间,即是文件最后的读取时间,例如:用命令cat filename,此时间修改,其他两个时间不修改。

i_ctime:结点最后修改时间,即是修改inode结构的时间,例如:用命令ln filename1 filename2,此时间修改,其他两个时间不修改。

i_mtime:文件最后修改时间,即是对文件内容的修改时间,例如:用命令echo aaa >filename,以上三个时间都修改。文章来源地址https://www.toymoban.com/news/detail-464694.html

到了这里,关于Linux-0.11 文件系统file_dev.c详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 操作系统实验 2.3系统调用:linux-0.11-lab “为版本0内核增加一个系统调用getjiffies” 和 “在用户程序中使用新增的系统调用”

    打开 vscode ,在如图所示位置打开 ~/os/linux-0.11-lab/0 文件夹 1.定义getjiffies系统调用 题目中给的提示:进入到 unistd.h 文件中 阅读代码,可以发现上图划线处有个系统调用名为 getpid :返回当前进程号——这与我们期望实现的功能类似:通过系统调用返回jiffies值。 于是此时希望

    2023年04月08日
    浏览(81)
  • Linux 0.11: 从开机到执行shell

    参考闪客的系列,将开机到执行shell的整个过程浓缩成本文。 https://github.com/dibingfa/flash-linux0.11-talk 当按下开机键的那一刻,在主板上提前写死的固件程序  BIOS  会将硬盘中 启动区的 512 字节 的数据,原封不动复制到 内存中的 0x7c00  这个位置,并跳转到那个位置进行执行。

    2024年04月13日
    浏览(18)
  • Linux /dev目录详解和Linux系统各个目录的作用

    在linux下,/dev目录是很重要的,各种设备都在下面。下面简单总结一下: dev是设备(device)的英文缩写。 /dev这个目录对所有的用户都十分重要。 因为在这个目录中包含了所有Linux系统中使用的外部设备。但是这里并不是放的外部设备的驱动程序,这一点和 windows ,dos操作系统不

    2024年04月11日
    浏览(33)
  • 【npm run dev报错】无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。

    1.win+X键,使用管理员身份运行power shell 2.输入命令:set-executionpolicy remotesigned 3.输入”Y“,回车,问题解决。 文章来源: 无法加载文件 C:Program Filesnodejsnpm.ps1,因为在此系统上禁止运行脚本。 - 前端知然 - 博客园 (cnblogs.com) https://www.cnblogs.com/chenzhiran/p/12080349.html

    2024年02月12日
    浏览(36)
  • 1.Linux开机卡在/dev/sda1:clean,***files,***blocks解决方案

    ##1. 出现原因 linux开机时显示器卡在卡在/dev/sda1:clean,***files,***blocks无法进入系统的原因可能是显卡驱动的问题或者系统升级的原因(近期内没有修改文件大概率是系统升级导致的驱动问题),也可能是磁盘空间问题。 linux开机时显示器卡在卡在/dev/sda1:clean,***files,***blo

    2024年02月15日
    浏览(46)
  • linux部署File Browser文件管理系统

    File Browser是go语言编写的软件,可以通过浏览器对服务器上的文件进行管理 浏览器访问地址:http://x.x.x.x:8080 默认用户名密码 admin/admin 初始化数据库 使用filebrowser命令修改filebrowser服务的相关参数,修改filebrowser服务监听地址为0.0.0.0,可以执行以下命令。 修改filebrowser服务监

    2024年02月21日
    浏览(30)
  • windows一键安装redis7.0.11

    下载地址: https://gitcode.net/zengliguang/windows_redis7.0.11_offline_install.git   使用git进行进行clone下载   在电脑桌面或者其他文件夹下 ,鼠标右键点击  选择git clone  ,下图中url为下载地址,Directory为本地存储路径,点击ok开始下载 如下图所示已成功下载   双击 redis-install-win.ba

    2024年02月08日
    浏览(34)
  • Win11 更新绕过TPM2.0 方法 最新最简单 亲测有效 Win11系统更新 DEV方式

    最新的win11内测把不符合硬件规定的人都排除出去了,虽然有注册表导入可以挤到DEV通道, 不过在更新到8%会弹出显示设备不支持提示,关闭窗口后升级被取消。因此特在实践后教大家如何绕过TPM2.0 更新的方法 。和正常更新一模一样,不会造成任何数据丢失等问题! 1.没有

    2024年02月07日
    浏览(40)
  • 【公告】BSV节点软件发布最新升级版本v1.0.11

    发表时间:2022年4月21日 信息来源:bitcoinsv.io 本次新发布的v1.0.11是基于v1.0.10版的推荐升级版本,对交易费的配置选项进行了一些更改,并修复了一些错误。  本次发布的软件里,相较此前版本的变更内容具体如下: 对以下配置选项进行了更名  -blockmintxfee 默认禁用 Bloom 过滤

    2023年04月08日
    浏览(72)
  • 阿里巴巴开源Chat2DB v1.0.11 初体验

    作为一名阿里巴巴开源项目的拥护者,从Chat2DB开源至今都有关注这个开源项目,因为之前的版本还存在较多BUG,暂时就没有分享,目前升级到 v1.0.11 版本后,我来谈谈我个人的一个使用感受 Chat2DB 是一款有开源免费的多数据库客户端工具,支持windows、mac本地安装,也支持服

    2024年02月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包