文件系统综述

linux 文件系统是基于MINIX 1.0文件系统,这部分的代码量是整个内核里最大的,但代码结构对应着MINIX文件系统的构成,还是比较清晰易读的。

MINIX文件系统

MINIX的文件系统由以下几部分组成:

  • 引导块:由BIOS自动读入的执行代码,这部分不在文件系统里描述;
  • 超级块:存放盘设备上文件系统的信息,如逻辑块数、i节点数、最大文件长度等;对应结构体super_block;
struct super_block {unsigned short s_ninodes;unsigned short s_nzones;unsigned short s_imap_blocks;unsigned short s_zmap_blocks;unsigned short s_firstdatazone;unsigned short s_log_zone_size;unsigned long  s_max_size;unsigned short s_magic;
/* These are only in memory */ //上面这些字段是具体存储在盘设备中,下面是在内存中初始化的结构体成员struct buffer_head   *s_imap[8];struct buffer_head   *s_zmap[8];unsigned short      s_dev;struct m_inode      *s_isup; //根目录i节点struct m_inode      *s_imount;unsigned long       s_time;struct task_struct   *s_wait;unsigned char       s_lock;unsigned char       s_rd_only;unsigned char       s_dirt;
};

  • i节点位图:表示i节点是否被使用,i节点对应文件或目录的索引,相当于能够创建或被内核管理的文件数量;
  • 逻辑块位图:表示逻辑块是否被使用,逻辑块是实际上的数据块,存储文件的内容;
  • i节点区域:存放具体的i节点数据;存储结构如下:
struct d_inode {unsigned short i_mode;unsigned short i_uid;unsigned long i_size;unsigned long i_time;unsigned char i_gid;unsigned char i_nlinks;unsigned short i_zone[9];//对应数据区内的逻辑块号,其中0~6是直接块号、7为一次直接块号、8是二次直接块号。
};

  • 数据区:即逻辑块区域;

同时在linux 0.11中还在内存开辟了缓冲区,通过hash散列表的形式支持数据块读取的缓冲。

功能分块:

从功能的角度分,linux 0.11 文件系统源码主要分为以下几块:

  • 高速缓冲区操作:buffer.c,逻辑块缓冲区,会调用块设备驱动接口;
  • MINIX文件系统底层操作,包括:文件系统向上提供的操作,包括:
    • bitmap.c:i节点位图和逻辑块位图操作;
    • truncate.c:释放某个i节点下的所有逻辑块;
    • namei.c:映射文件名至i节点;
    • inode.c:i节点获取、释放登操作;
    • super.c:超级块操作;
  • linux文件系统对上提供的调用封装:
    • read_write.c:提供sys_read和sys_wirte两个系统调用的接口实现;open.c:open.c: sys_create、sys_open等系统调用实现

      • block_dev.c:块设备驱动类文件操作,被read_write.c调用;
      • file_dev.c:普通文件操作,被read_write.c调用;
      • char_dev.c:字符驱动类文件操作,被read_write.c调用;
      • pipe.c:管道操作,被read_write.c调用;
    • open:sys_create、sys_open等系统调用实现;
    • exec.c:主要实现do_execute,即实现加载并启动一个可执行文件.out或shell脚本;
    • fcontl.c:sys_fcntl、sys_dup等系统调用接口;
    • stat.c:sys_stat等系统调用接口;

核心业务流程

以创建一个文件为例,看下linux 0.11中文件系统各部分源码的关系:

  1. 调用sys_open打开一个文件,输入文件名、模式等;
  2. 调用open_namei获取其i节点,open_namei会调用和bitmap和inode.c的底层操作,找到该文件对应的逻辑块;
  3. 调用buffer.c中的操作读取这些逻辑块,当缓冲中不存在逻辑块数据时,会调用块设备驱动;这些逻辑块的地址(应该是缓冲区的地址)会保存在m_inode结构体中;
  4. 从file_table数组中返回一个文件句柄(即数组索引),其指向的file结构中包含了m_inode。

转载于:https://www.cnblogs.com/Fredric-2013/archive/2013/05/11/3072834.html

linux 0.11 源码学习(十四)相关推荐

  1. linux 0.11 源码学习(二)

    linux 0.11的运行 linux 0.11版本的编译和运行可以基于bochs,个人参考的是赵博的文章,主要是三块工作: 制作linux镜像,按要求修改makefile后,可以直接在redhat上 ...

  2. Box2d源码学习十四TOI之碰撞时间的实现

    本系列博客是由扭曲45原创,欢迎转载,转载时注明出处,http://blog.csdn.net/cg0206/article/details/8441644 TOI全称Time of Impact,中 ...

  3. linux 0.11源码下载,Linux-0.11-sourc

    带中文注释的linux源码VER-0.11/ 带中文注释的linux源码VER-0.11/boot/ 带中文注释的linux源码VER-0.11/boot/bootsect.s 带中文注释的linux ...

  4. mongo源码学习(四)服务入口点ServiceEntryPoint

    在上一篇博客mongo源码学习(三)请求接收传输层中,稍微分析了一下TransportLayer的作用,这篇来看下ServiceEntryPoint是怎么做的. 首先ServiceEntryPoint ...

  5. Spring源码学习(四) | @Configuration的cglib动态代理

    文章目录 前言 例子 @Configuration :full or lite 设置 full or lite Cglib生成代理类AppConfig Where is it generated Ho ...

  6. Spring源码学习第四天==>初识Refresh()

    Spring中AbstractApplicationContext的Refresh方法 Refresh方法可以算的上是SpringIOC容器启动的核心方法了.这几天进行了深入的学习,溯源,整理流程图. ...

  7. AVB源码学习(四):AVB2.0-libavb库介绍1

    参考资料 感谢前辈的blog,安全相关的资料可太少了,很详细很卓越 https://blog.csdn.net/jackone12347/article/details/116241676 前言 首先 ...

  8. Java集合源码学习(四)HashMap

    一.数组.链表和哈希表结构 数据结构中有数组和链表来实现对数据的存储,这两者有不同的应用场景, 数组的特点是:寻址容易,插入和删除困难:链表的特点是:寻址困难,插入和删除容易: 哈希表的实现结合了这两 ...

  9. GCC源码分析(十四) — rtx结构体,指令与栈分配

    版权声明:本文为CSDN博主「ashimida@」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/lidan1 ...

最新文章

  1. Visual Studio 2017新版发布,极大提高开发效率丨附下载
  2. SQL安装时出现“以前的某个程序安装已在安装计算机上创建挂起的文件操作。运作安装程序之前必须重新启动计算机”...
  3. Django的ORM映射机制与数据库实战
  4. Selenium常用方法及函数
  5. python自学_为什么要选择Python怎样系统的自学并快速学习Python
  6. 解析oracle的rownum
  7. 登录时记住用户名和密码及cookie案例应用
  8. linux快照软件哪个好,Linux下的快照snapshot的实现
  9. 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现
  10. 啥叫“Functional Programming ”???
  11. C++二分查找,时间复杂度是O(logn)
  12. 编程求完全二叉树的叶子结点数
  13. android6.0以上模拟位置状态检测
  14. 【kali技巧】kali配置ssh服务
  15. Python爬虫:搜狗(微信,知乎)公众号内容
  16. springboot前后端分离,邮箱/手机验证号激活和登录,手机注册和激活
  17. 基于瑞芯微平台cif接口dvp相机的视频接入(ov2640、rv1126为例)
  18. 仿京东天猫商品详情页
  19. 偷学Python第十三天:字典的基本操作
  20. 用python画象棋棋盘_Python turtle绘画象棋棋盘

热门文章

  1. Java实现计算器的基本功能
  2. 正在将错误信息上传至服务器,android - 将Base64编码的图像上传到服务器-400服务器错误 - 堆栈内存溢出...
  3. Machine Learning Yearning 中文翻译稿
  4. 打榜前10名:天池AI医疗人工智能辅助糖尿病遗传风险预测
  5. 360下拉词电脑端优化推广是怎么做的呢?
  6. nsq php,NSQ 最佳实践
  7. 11gR2conceptes Memory Architecture中文翻译
  8. unity 彩带粒子_Unity3d粒子特效:制作火焰效果
  9. 风一样的坑爹哥rust1_醒醒吧,烂大街的“北欧风”根本不实用!
  10. ping32终端安全管理系统_通过Ping32工单管理功能使用教程