linux 0.11 源码学习(十四)
文件系统综述
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等系统调用接口;
- read_write.c:提供sys_read和sys_wirte两个系统调用的接口实现;open.c:open.c: sys_create、sys_open等系统调用实现
核心业务流程
以创建一个文件为例,看下linux 0.11中文件系统各部分源码的关系:
- 调用sys_open打开一个文件,输入文件名、模式等;
- 调用open_namei获取其i节点,open_namei会调用和bitmap和inode.c的底层操作,找到该文件对应的逻辑块;
- 调用buffer.c中的操作读取这些逻辑块,当缓冲中不存在逻辑块数据时,会调用块设备驱动;这些逻辑块的地址(应该是缓冲区的地址)会保存在m_inode结构体中;
- 从file_table数组中返回一个文件句柄(即数组索引),其指向的file结构中包含了m_inode。
转载于:https://www.cnblogs.com/Fredric-2013/archive/2013/05/11/3072834.html
linux 0.11 源码学习(十四)相关推荐
- linux 0.11 源码学习(二)
linux 0.11的运行 linux 0.11版本的编译和运行可以基于bochs,个人参考的是赵博的文章,主要是三块工作: 制作linux镜像,按要求修改makefile后,可以直接在redhat上 ...
- Box2d源码学习十四TOI之碰撞时间的实现
本系列博客是由扭曲45原创,欢迎转载,转载时注明出处,http://blog.csdn.net/cg0206/article/details/8441644 TOI全称Time of Impact,中 ...
- linux 0.11源码下载,Linux-0.11-sourc
带中文注释的linux源码VER-0.11/ 带中文注释的linux源码VER-0.11/boot/ 带中文注释的linux源码VER-0.11/boot/bootsect.s 带中文注释的linux ...
- mongo源码学习(四)服务入口点ServiceEntryPoint
在上一篇博客mongo源码学习(三)请求接收传输层中,稍微分析了一下TransportLayer的作用,这篇来看下ServiceEntryPoint是怎么做的. 首先ServiceEntryPoint ...
- Spring源码学习(四) | @Configuration的cglib动态代理
文章目录 前言 例子 @Configuration :full or lite 设置 full or lite Cglib生成代理类AppConfig Where is it generated Ho ...
- Spring源码学习第四天==>初识Refresh()
Spring中AbstractApplicationContext的Refresh方法 Refresh方法可以算的上是SpringIOC容器启动的核心方法了.这几天进行了深入的学习,溯源,整理流程图. ...
- AVB源码学习(四):AVB2.0-libavb库介绍1
参考资料 感谢前辈的blog,安全相关的资料可太少了,很详细很卓越 https://blog.csdn.net/jackone12347/article/details/116241676 前言 首先 ...
- Java集合源码学习(四)HashMap
一.数组.链表和哈希表结构 数据结构中有数组和链表来实现对数据的存储,这两者有不同的应用场景, 数组的特点是:寻址容易,插入和删除困难:链表的特点是:寻址困难,插入和删除容易: 哈希表的实现结合了这两 ...
- GCC源码分析(十四) — rtx结构体,指令与栈分配
版权声明:本文为CSDN博主「ashimida@」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/lidan1 ...
最新文章
- Visual Studio 2017新版发布,极大提高开发效率丨附下载
- SQL安装时出现“以前的某个程序安装已在安装计算机上创建挂起的文件操作。运作安装程序之前必须重新启动计算机”...
- Django的ORM映射机制与数据库实战
- Selenium常用方法及函数
- python自学_为什么要选择Python怎样系统的自学并快速学习Python
- 解析oracle的rownum
- 登录时记住用户名和密码及cookie案例应用
- linux快照软件哪个好,Linux下的快照snapshot的实现
- 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现
- 啥叫“Functional Programming ”???
- C++二分查找,时间复杂度是O(logn)
- 编程求完全二叉树的叶子结点数
- android6.0以上模拟位置状态检测
- 【kali技巧】kali配置ssh服务
- Python爬虫:搜狗(微信,知乎)公众号内容
- springboot前后端分离,邮箱/手机验证号激活和登录,手机注册和激活
- 基于瑞芯微平台cif接口dvp相机的视频接入(ov2640、rv1126为例)
- 仿京东天猫商品详情页
- 偷学Python第十三天:字典的基本操作
- 用python画象棋棋盘_Python turtle绘画象棋棋盘
热门文章
- Java实现计算器的基本功能
- 正在将错误信息上传至服务器,android - 将Base64编码的图像上传到服务器-400服务器错误 - 堆栈内存溢出...
- Machine Learning Yearning 中文翻译稿
- 打榜前10名:天池AI医疗人工智能辅助糖尿病遗传风险预测
- 360下拉词电脑端优化推广是怎么做的呢?
- nsq php,NSQ 最佳实践
- 11gR2conceptes Memory Architecture中文翻译
- unity 彩带粒子_Unity3d粒子特效:制作火焰效果
- 风一样的坑爹哥rust1_醒醒吧,烂大街的“北欧风”根本不实用!
- ping32终端安全管理系统_通过Ping32工单管理功能使用教程