首页 > 其他分享 >第十一章学习笔记

第十一章学习笔记

时间:2023-10-15 21:00:45浏览次数:31  
标签:name 第十一章 文件系统 笔记 学习 索引 磁盘 节点 EXT2

第十一章:EXT2文件系统

一、EXT2文件系统的数据结构

  1.通过mkfs创建虚拟磁盘

  • make2fs [-b blksize -N ninodes] device nblocks:在设备上创建一个nblocks个块(每个块大小为blksize)和ninodes个索引节点的ext2文件系统  (未指定blksize则默认1kb,未指定ninodes价格根据nblocks计算默认的ninodes数。

     :可在名为vdisk的虚拟硬盘上创建有1440个大小1kb的块的ext2文件系统

2.超级块

block#0:引导块,用来容纳引导程序,从磁盘引导操作系统。

block#1:超级块,用于容纳整个文件系统的信息。

 3.块组描述符

block#2:块组描述符块。ext2文件系统将磁盘分成几个组。每个组有8192个块(硬盘上大小为32k)每个组用一个块描述符结构体来描述。

 4.块和索引节点位图

Block#8∶块位图(Bmap)(bg block bitmap)位图是用来表示某种项的位序列,例如磁盘块或索引节点。位图用于分配和回收项。在位图中,0位表示对应项处于FREE状态,1位表示对应项处于IN USE状态。一个软盘有1440个块,但是 Block#0未被文件系统使用。所以,位图只有1439个有效位。无效位被视作INUSE,设置为1。
Block#9∶索引节点位图(Imap)(bg inode bitmap)一个索引节点就是用来代表一个文件的数据结构。EXT2文件系统是使用有限数量的索引节点创建的。各索引节点的状态用B9的Imap 中的一个位表示。在EXT2 FS中,前10个索引节点是预留的。所以,空 EXT2 FS的Imap 以10个1开头,然后是0。无效位再次设置为1。

5.索引节点

block#10:索引开始节点。每个文件都用一个128字节(EXT4中是256字节)的唯一索引节点结构体表示。

 

 

直接块: block[0]至iblock[11],指向直接磁盘块。
间接块:iblock[12]指向一个包含256个块编号(对于1KB BLKSIZE)的磁盘块,每个块编号指向一个磁盘块。
双重间接块:i block[13]指向一个指向 256个块的块,每个块指向256个磁盘块。
三重间接块:iblock[14]是三重间接块。对于"小型"EXT2文件系统,可以忽略它。

6.数据块

紧跟在索引节点块后面的是文件存储数据块。

7.目录条目

 

二、 邮差算法

一个城市有M个街区,编号从0到M-1.每个街区有N座房子,编号从0到N-1.每座房子有一个唯一的街区地址,用(街区,房子)表示。已知某个街区地址BA=(街区,房子),怎么把它转换为线性地址LA,或者已知线性地址,怎么转换为街区地址?

Linear_address LA=N*block + house;

Block_address BA=(LA/N,LA%N);

1.C语言中的Test-Set-Clear位
struct bits{

unsigned int bit0 : 1; //bit0 field is a single bit

unsigned int bit123 : 3; // bit123 field is a range of 3 bits

unsigned int otherbits :27; // other bits field has 27 bits

unsigned int bit31 :1; // bit31 is the highest bit

}var;

2.将索引节点号转换为磁盘上的索引节点
在 EXT2文件系统中,每个文件都有一个唯一的索引节点结构。在文件系统磁盘上,索引节点从inode table块开始。每个磁盘块包含

INODES_PER_BLOCK = BLoCK_SIZE/sizeof(INODE)

个索引节点。每个索引节点都有一个唯一的索引节点号,ino=1,2,…,从1开始线性计数。已知一个ino,如1234,那么哪个磁盘块包含该索引节点,以及哪个索引节点在该块中呢?我们需要知道磁盘块号,因为需要通过块来读/写一个真正的磁盘。

三、编程示例

安装ext2fs开发包:sudo apt-get install ext2fs-dev

四、遍历EXT2文件系统树

(1)读取超级块。检查幻数s_magic(0xEF53),验证它确实是 EXT2 FS。
(2)读取块组描述符块(1 + s_first_data_block),以访问组0描述符。从块组描述符的bg_inode_table条目中找到索引节点的起始块编号,并将其称为InodesBeginBlock。
(3)读取 InodeBeginBlock,获取/的索引节点,即 INODE#2。
(4)将路径名标记为组件字符串,假设组件数量为n。例如,如果路径名 =/a/b/c,则组件字符串是"a""b""c",其中n=3。用name[0],name[1],…,name[n-1]来表示组件。
(5)从(3)中的根索引节点开始,在其数据块中搜索 name[0]。为简单起见,我们可以假设某个目录中的条目数量很少,因此一个目录索引节点只有12个直接数据块。有了这个假设,就可以在12个(非零)直接块中搜索 name[0]。目录索引节点的每个数据块都包含以下形式的 dir entry 结构体;
[ino rec_len name_len NAME] [ino rec_len name_len NAME]....
其中NAME是一系列nlen字符,不含终止NUL。对于每个数据块,将该块读入内存并使用 dir_entry dp指向加载的数据块。然后使用 name_len将NAME提取为字符串,并与name[0]进行比较。如果它们不匹配,则通过以下代码转到下一个dir_entry:
dp =(dir_entry)((char *)dp + dp->rec_len);
继续搜索。如果存在 name[0],则可以找到它的 dir_entry,从而找到它的索引节点号。
(6)使用索引节点号ino来定位相应的索引节点。回想前面的内容,ino 从1开始计数。使用邮差算法计算包含索引节点的磁盘块及其在该块中的偏移量。

blk =(ino - 1) / INODE8_PER_BLOCK + InodesBeginBlock;
offset = (ino - 1) % INODES_PER_BLOCK;
然后在索引节点中读取/a,从中确定它是否是一个目录(DIR)。如果/a不是目录,则不能有/a/b,因此搜索失败。如果它是目录,并且有更多需要搜索的组件,那么继续搜索下一个组件 name[1]。现在的问题是∶在索引节点中搜索/a的 name[1],与第(5)步完全相同。
(7)由于(5)~(6)步将会重复n次,所以最好编写一个搜索函数∶

u32 search (INODE *inodePtr, char *name)
{
// search for name in the data blocks of current DIR inode
// if found, return its ino; else return 0 )
}
然后我们只需调用 search()n次,如下所示。

Assume:n,name[0],....,name[n-1] are globals
INODE *ip points at INODE of /
for(i=0; i<n; i++)
{
ino = search(ip, name[4])
if(!ino){ // can't find name[i], exit;}
use ino to zead in INODE and let ip point to INODE
}

如果搜索循环成功结束,ip必须指向路径名的索引节点。遍历有多个组的大型 EXT2/3 文件系统也是类似操作。

五、EXT2文件系统的实现

1.文件系统的结构

(1)当前运行进程的PROC结构体;

(2)文件系统的根指针;

(3)一个openTable条目;

(4)内存索引节点;

(5)已挂载的文件系统表。

2.文件系统的级别

第1级别实现了基本文件系统树,以实现指定函数,第2级别实现了文件内容的读/写函数,第3级别实现了文件系统的挂载、卸载和文件保护。

六、基本文件系统

1.type.h文件

这类文件包含EXT2文件系统的数据结构类型,比如超块、组描述符、索引节点和目录条目结构。此外,它还包含打开文件表、挂载表、PROC结构体和文件系统常数。

2.global.c文件

这类文件包含文件系统的全局变量。全局变量的例子有:
MINODE minode [NMINODE]; // in memory INODEs

MTABLE mtable [NMTABLE]; // mount tables

OFT oft [NOFT]; // Opened file instance

PROC proc[NPROC]PROC ] // PROC structures

PROC *running; // current executing

代码实践

创建

 格式化

 

标签:name,第十一章,文件系统,笔记,学习,索引,磁盘,节点,EXT2
From: https://www.cnblogs.com/adbl/p/17766172.html

相关文章

  • 2023-2024-1 学号20231318 《计算机基础与程序设计》第三周学习总结
    作业信息这个作业属于哪个课程2022-2023-1-计算机基础与程序设计这个作业要求在哪里2022-2023-1计算机基础与程序设计第三周作业这个作业的目标1.学习《计算机科学概论》第二章,第三章并完成云班课测试;2.学习《C语言程序设计》第二章并完成云班课测试。作业正......
  • BASE64编码的相关学习
    网上查找资料学习BASE64编码相关内容,回答:什么是BASE64编码,解决什么问题?使用资源中提供的工具对自己的学号和姓名进行BASE64编码和解码BASE64编码是一种将二进制数据转换为可打印字符的编码方式,解决文本协议中不能直接传输二进制数据的问题。......
  • 2023-2024-1 20231412《计算机基础与程序设计》第三周学习总结
    作业课程https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP作业要求https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/homework/12999作业目标《计算机概论》第二、三章;《C语言程序设计》第二章作业正文https://www.cnblogs.com/gw1415/p/17766147......
  • 2023-2024-1 20231419 《计算机基础与程序设计》第三周学习总结
    2023-2024-120231419《计算机基础与程序设计》第三周学习总结作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK03这个作业的目标预习《计算机科学概......
  • 学习笔记5
    EXT2文件系统EXT2(TheSecondExtendedFileSystem)是Linux的标准文件系统,一直以来被广泛使用。EXT3是EXT2的扩展版本,增加了一个日志系统。文件系统背景Linux标准文件系统:EXT2是Linux的标准文件系统,多年来一直被广泛使用。EXT3的扩展:EXT3是EXT2的扩展版本,主要增加了一个日......
  • 学期2023-2024-1 20231403 《计算机基础与程序设计》第三周学习总结
    作业信息这个作业属于哪个课程<班级的链接>(如2022-2023-1-计算机基础与程序设计)这个作业要求在哪里2023-2024-1计算机基础与程序设计第三周作业)这个作业的目标自学教材:计算机科学概论第2章,第3章,C语言程序设计第2章并完成云班课测试作业正文https://www.cnblog......
  • 2023-2024-1 20231411李宇轩 《计算机基础与程序设计》第3周学习总结
    这个作业属于哪个课程2022-2023-1-计算机基础与程序设计这个作业要求在哪里[2022-2023-1计算机基础与程序设计第三周作业]https://www.cnblogs.com/rocedu/p/9577842.html#WEEK03这个作业的目标学习计算机科学概论第2章,第3章并完成云班课测试作业正文https://......
  • 学习笔记5
    知识点归纳EXT2文件系统EXT2文件系统是一种用于Linux操作系统的文件系统。它是EXT文件系统的第二个版本,与其前身相比具有许多改进和增强功能。EXT2文件系统提供了可靠的数据存储和管理,可以在硬盘上组织文件和目录,并提供了文件权限、访问控制、日志记录等功能。EXT2文件系统使用......
  • 2023-2024学年 20213423 《计算机基础与程序设计》第三周学习总结
    第三章是《计算机科学概论》中一个非常重要的章节,它涵盖了计算机的内部结构和工作原理。通过学习这一章,我更深入地了解了计算机是如何运行的,以及其中涉及到的各种关键组件和概念。以下是我学习这一章的一些心得体会:首先,我学到了计算机的基本组成部分,包括中央处理单元(CPU)、内存、......
  • 学习笔记5
    第11章Diffle-Hellman协议  Diffle-Hellman协议主要用于密钥交换,使得在不安全线路上通信的两个人能够以这样的方式协商得到密钥:两个人都能得到相同的密钥,并且这个密钥不会泄露给监听二人会话的其他人。11.1群11.2基本的DH  在基本的DH协议中,首先选取一个大素数$p$和群$......