建立文件系统

【0】README

0.1) source code and text description are from orange’s implemention of a os and for complete code, please visit https://github.com/pacosonTang/Orange-s-OS/blob/master/orange_s_fs.tar;
0.2) 此文件系统涉及到的数据结构 仅仅针对于 orange’s OS, 并不是linux等 *nix 的官方file system data structure ;该文件系统仅仅作为 学习*nux 文件系统的铺垫;
0.3) 由于, 我的硬盘大小为80M 不方便上传, 故还请访客自行创建虚拟硬盘, (如何创建虚拟硬盘,参见http://blog.csdn.net/pacosonswjtu/article/details/48846887 , 如何建立硬盘分区表,参见 http://blog.csdn.net/pacosonswjtu/article/details/48846763)
0.4) 建立文件系统代码的目录树:

这里写图片描述

0.5) 文件系统结构图如下:
这里写图片描述


【1】我们看 建立文件系统的代码是如何调用的?

这里写图片描述

  • 上述代码中的task_fs() , 它调用函数 init_fs(),而init_fs() 在打开ROOT_DEV 之后调用了mkfs(),这便是建立文件系统的函数了;

【2】关于mkfs建立文件系统代码分析

2.1)mkfs代码有这么几个部分:

  • part1)向硬盘驱动程序 索取 ROOT_DEV的起始扇区和大小;
  • part2)建立超级块-super block;
  • part3)建立 inode-map;
  • part4)建立 sector-map;
  • part5)写入 inode_array;
  • part6)建立根目录文件;

2.2) 文件系统内 的 inode 数目上限是多少?
我们决定最多允许有 4096个inode, 这样只需要一个扇区来做inode-map就可以了(4096==一个扇区的bits 数目)。这个决定同时意味着我们的file system 最多容纳 4096个文件;
2.3) 在ms_fs()中, 所有写入磁盘的内容都是先放进fsbuf 这个缓冲区的,我们定义了一个指针,让它指向 0x600000:

    /*** 6MB~7MB: buffer for FS*/PUBLIC  u8 *     fsbuf   = (u8*)0x600000;PUBLIC  const int   FSBUF_SIZE  = 0x100000;

也就是说,我们指定内存地址 6M~7M 为文件系统的缓冲区,一定程度上,这算是一种低级形态的内存管理吧;

2.4) mk_fs()写好了,我们看一下运行效果:
这里写图片描述


【3】根据以上输出,我们看一下 磁盘中的实际内容:

3.1)超级块开始于 0x9E0000(占用一个扇区512个字节,实际用56个字节):

xxd -u -a -g l -c 16 -s 0x9E0000 -l 512 80m.img

这里写图片描述
这里写图片描述
这里写图片描述
Attention):超级块 的 结构体成员 int sb_dev 在硬盘上是不存在的,仅针对我们的orange’s os 而言, 所以超级块的结构体大小为56 bytes;

3.2) inode-map开始于 0x9E0200(占用1个扇区512个字节):

xxd -u -a -g l -c 16 -s 0x9E0200 -l 512 80m.img

这里写图片描述

  • Analysis):
    A1)分配一个扇区==512字节==4096 bits == 可以记录4096个inode 的使用情况哦;
    A2)显然 0x1F==00011111,也即前5个inode 已经被使用了;

    bit0:reserved,保留;
    bit1:指向根目录'/' 的(根目录文件时数据区的第一个文件)inode;
    bit2:指向 /dev_tty0 的inode;
    bit3:指向 /dev_tty1 的inode;
    bit4:指向 /dev_tty2 的inode;
    

    A3): dev_tty[0,1,2] 三个文件称为 字符设备特殊文件,暂且创建,后续可能使用;

3.3) sector-map开始于 0x9E0400(sector-map占用扇区数依据该硬盘总扇区数决定):

xxd -u -a -g l -c 16 -s 0x9E0400 -l 512 80m.img

这里写图片描述

  • Analysis)
    A1)由 超级块super block 可知,硬盘的扇区总数为 0x9D41 = 40257 sectors ;
    A2)又一个bit位映射一个扇区的使用情况(1已被使用,0未被使用) ,所以40257 /8 =5032(大约)Bytes = 大约10个扇区左右;
    A3)从上图,我们看到,有2049个扇区被使用了;
    A4)又, 0x9E1800 - 0x9E0400 = 0x1400,所以中间的字节数=16^3 + 4*16^2=4096 + 1024 = 5120 bytes (约等于 5032bytes ,呵呵,大致正确啦)

3.4)inode-array开始于 0x9E1800(每个inode数据结构大小=32bytes):

xxd -u -a -g l -c 16 -s 0x9E1800 -l 512 80m.img

这里写图片描述
这里写图片描述
这里写图片描述

  • Analysis)
    A1)这就是具体的inode 数据结构信息的存储空间啦;
    A2)由图,以及根目录文件开始于 0xA01800,我们知道 0xA01800 - 0x9E1800 = 0x20000 = 2^17 bytes
    A3)又,每个inode=32bytes, 所以依据以上数据,算出实际的inode = 2^12 =2048 个inode = 2048个文件;

3.5)根目录文件开始于 0xA01800(每个根目录dir_entry数据结构大小为16 bytes):

xxd -u -a -g l -c 16 -s 0xA01800 -l 512 80m.img

这里写图片描述
这里写图片描述
这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

判断字符串是否为空

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>检查指定的值是不是空字符串</title><script>function test_1() {// var name document.getElementById("name").value;// ale…

java策略设计模式_Java中的策略设计模式

java策略设计模式策略设计模式是一种行为模式&#xff0c;其中我们有多种算法/策略来完成一项任务&#xff0c;所使用的算法/策略留给客户选择。 各种算法选项封装在单独的类中。 在本教程中&#xff0c;我们将学习在Java中实现策略设计模式。 UML表示形式&#xff1a; 首先&…

随机森林算法 python_Python实现的随机森林算法与简单总结

本文实例讲述了Python实现的随机森林算法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;随机森林是数据挖掘中非常常用的分类预测算法&#xff0c;以分类或回归的决策树为基分类器。算法的一些基本要点&#xff1a;*对大小为m的数据集进行样本量同样为m的有放回抽样&…

Hibernate的学习笔记

文章目录简介配置文件hibernate.cfg.xml映射配置文件主键生成方式主键生成方式的配置identitysequencenativeincrementassigned映射类型使用 Hibernate 实现 CRUD简介 Hibernate是对象关系映射&#xff08;ORM&#xff0c;Object RelationShip Mapping&#xff09;框架&#x…

在diy的文件系统上创建文件的流程

【0】README 0.1&#xff09; source code are from orange’s implemention of a os , and for complete code , please visit https://github.com/pacosonTang/Orange-s-OS/tree/master/fs_create_file_p366 &#xff1b; 0.2&#xff09;本文总结的内容是干货&#xff0c;…

java设计模式 订阅模式_Java中的外观设计模式

java设计模式 订阅模式立面是指建筑物的外观。 当穿过街道时&#xff0c;我们所看到的只是建筑物的外观。 该工作面抽象了建筑物的所有复杂实现细节。 同样&#xff0c; 外观设计模式旨在为子系统中的一组接口提供统一的接口。 这个统一的接口对客户端隐藏了子系统的复杂性。 …

dnn模型 list index out of range_基于svm的财务预警模型

前言本文将我国A股上市公司作为研究对象&#xff0c;选取了A股 2015-2019 年度被 ST 或被 *ST上市公司&#xff0c;剔除了部分非财务原因导致ST或*ST的上市公司。财务指标选择了T-3期的资产负债率、流动比率、应收账款周转率等10个财务指标。数据收集及预处理导入所需要库 im…

汇编操作显存

【0】README 0.1&#xff09;本文转自&#xff1a; http://www.cnblogs.com/youxin/archive/2012/05/21/2512329.html for relative source code , please visit https://github.com/pacosonTang/Orange-s-OS/blob/master/lib.inc 【1】关于 80*25彩色字符模式显示缓冲区&…

Hibernate中的实体对象的三种状态

对于 Hibernate 而言&#xff0c;实体对象的状态分为三种&#xff1a; 1.暂时态 当对象刚创建&#xff0c;和 Session 没有发生任何关系时&#xff0c;当程序运行完就立刻消失&#xff0c;被称为暂时态。 2.持久态 持久态的对象和 Session 发生了关系&#xff0c;如执行了 ses…

java设计模式之状态模式_Java中的状态设计模式

java设计模式之状态模式在本教程中&#xff0c;我们将探讨另一种流行的行为设计模式-状态设计模式。 当我们使用可以存在于多个状态的对象时&#xff0c;状态设计模式的知识变得非常有用。 当对象的行为取决于其当前状态时&#xff0c;我们应该主要使用它。 这种模式有助于我们…

php概率计算_PHP指定概率算法

PHP指定概率算法&#xff0c;可用于刮刮卡&#xff0c;大转盘等抽奖算法。假设&#xff1a;有一个二维数组&#xff0c;记录了所有本次抽奖的奖项信息&#xff1a;$test_arr array(a>20,b>30,c>50);a奖概率20%&#xff0c;b奖概率30%&#xff0c;c奖概率50%模拟函数执…

os如何处理键盘的所有按键,显示or不显示,显示是如何显示

【0】README 0.1&#xff09; source code and text decription are from orange’s implemention of a os , and for complete code , please visit 我待会上传&#xff1b; 【1】 键盘输入缓冲区 step1&#xff09;缓冲区的数据结构如下&#xff1a; step2&#xff09;对…

Hibernate的缓存机制/会话级缓存机制

Hibernate 中维持了两级缓存。第一级缓存由 Session 实例维护&#xff0c;该缓存区保存着与该 Session 实例有关联的所有实体对象的数据&#xff0c;也称为内部缓存。而第二级缓存则存在于 SessionFactory 实例中&#xff0c;由通过该 SessionFactory 实例获取的所有 Session 实…

orm提取指定列_使用ORM提取数据很容易! 是吗?

orm提取指定列介绍 几乎所有系统都以某种方式与外部数据存储一起运行。 在大多数情况下&#xff0c;它是一个关系数据库&#xff0c;并且通常将数据获取委托给某些ORM实现。 ORM涵盖了很多例程&#xff0c;并且带来了一些新的抽象作为回报。 Martin Fowler写了一篇有关ORM的有…

如何编译文件(gcc + nasm)

【0】README 编译文件(nasm gcc)&#xff0c;特别是编译目标文件的依赖文件&#xff1b;本文旨在回顾 gcc 和 nams 编译器的编译命令&#xff0c;以及如果有多个依赖文件该如何编译&#xff1b; 【1】编译文件 1.1&#xff09;编译 lib/syscall.asm(lib/syscall.asm) nasm …

Hibernate中的Session.load() 和 Session.get() 的区别

文章目录相同点区别懒加载的问题执行语句 session.load(UserInfoBean.class,2) 会先在一级缓存中找 id2 的 UserInfoBean 对象&#xff08;看红色线条&#xff09;&#xff0c;找不到去二级缓存找&#xff0c;还找不到就不找了&#xff0c;直接获取一个代理对象并返回该对象。当…

python 分布式队列_〖Python〗-- Celery分布式任务队列

【Celery分布式任务队列】一、Celery介绍和基本使用Celery 是一个 基于python开发的分布式异步消息任务队列&#xff0c;通过它可以轻松的实现任务的异步处理&#xff0c; 如果你的业务场景中需要用到异步任务&#xff0c;就可以考虑使用celery&#xff0c; 举几个实例场景中可…

最大子序列和问题的解(共4种,层层推进)

【0】README 0.1&#xff09; source code and text description are from data structure and alg analysis &#xff1b; 0.2&#xff09; there are 4 methods solving maximum sum of subsequence&#xff0c; but the fourth proves to be the best one , the 3rd deser…

java设计模式代理模式_Java中的代理设计模式

java设计模式代理模式代理对象或代理对象为另一个对象提供占位符&#xff0c;以控制对该对象的访问。 代理充当原始对象的轻量级版本或简化版本。 它支持与原始对象相同的操作&#xff0c;但可以将那些请求委托给原始对象以实现它们。 代理设计模式是一种结构模式&#xff0c;…

Struts2参数值自动注入到JavaBean对象的属性中和JavaBean对象的属性值展示在页面中

文章目录参数值自动注入示例代码将JavaBean的属性值显示在页面上示例代码参数值自动注入 注意事项&#xff1a; 1.前端界面的表单项的参数命名格式为&#xff1a;Action属性名.JavaBean的属性名 2.Action的属性必须要有setter/getter方法&#xff0c;注入时会调用setter方法 …