首页 > 其他分享 >信息安全系统设计与实现课程第十一章学习笔记

信息安全系统设计与实现课程第十一章学习笔记

时间:2023-10-05 09:00:47浏览次数:48  
标签:文件 EXT2 int 第十一章 信息安全 文件系统 笔记 printf block

一、知识点归纳

1. EXT2文件系统

多年来,Linux 一直使用EXT2(Card等1995)作为默认文件系统。EXT3(EXT3,2014)是EXT2的扩展。EXT3中增加的主要内容是一个日志文件,它将文件系统的变更 记录在日志中°日志可在文件系统崩溃时更快地从错误中恢复。没有错误的EXT3文件系 统与EXT2文件系统相同。EXT3的最新扩展是EXT4 ( Cao等2007)。EXT4的主要变化是磁盘块的分配。在EXT4中,块编号为48位。EXT4不是分配不连续的磁盘块,而是分配连续的磁盘块区,称为区段。除了这些细微的更改之外,文件系统结构和文件操作保持不变。本书的目的是讲授文件系统的原理°主要目标并非实现大的文件存储容量,而是重点论述文件系统设计和实现的原则,强调简单性以及与Linux的兼容性。为此,我们以ETX2作为文件系统。

2. EXT2文件系统数据结构

  • 超级块(Superblock):包含文件系统的元数据信息,如块大小、inode数量等。
  • 块组描述符(Block Group Descriptor):描述块组的信息,如块位图、inode位图、inode表的位置。
  • 块位图和inode位图:用于跟踪块和inode的分配情况。
  • 索引节点表(Inode Table):存储文件和目录的元数据信息。

使用mke2fs命令可以在设备上创建EXT2文件系统,示例命令如下:

mke2fs [-b blksize -N ninodes] device nblocks

其中,blksize指定块大小,ninodes指定inode数量,device是目标设备,nblocks是块数量。

在EXT2文件系统上,可以执行多种文件操作。以下是一些示例:

2.1 创建文件夹

使用mkdir命令可以创建文件夹,例如:

 mkdir myfolder

2.2 创建文件

使用touch命令可以创建空文件,例如:

touch myfile.txt

2.3 复制文件

使用cp命令可以复制文件到指定位置,例如:

cp sourcefile.txt destination/

2.4移动/重命名文件

使用mv命令可以移动文件到新位置或重命名文件,例如:

mv oldfile.txt newfile.txt

2.5 删除文件

使用rm命令可以删除文件,例如:

rm myfile.txt

2.6 查看文件内容

使用cat命令可以查看文件的内容,例如:

cat myfile.txt

3.邮差算法

邮差算法用于将街区和房子的地址映射到线性地址,以便外星人或其他系统能够理解和处理这些地址。它的原理是:

  • 对于给定的街区地址BA,线性地址LA可以计算为:LA = N * block + house。
  • 对于给定的线性地址LA,可以计算街区地址BA为:BA = (LA / N, LA % N)。

以下是一个示例代码,演示如何使用邮差算法将逻辑块地址转换为磁盘块地址。这里使用了一个简单的C函数 block_to_chs 来执行转换,假设一个虚拟的CHS磁盘,其中柱面、磁头、扇区都以0开始计数。

#include <stdio.h>

// 定义虚拟磁盘的参数
#define NUM_CYLINDERS 100
#define NUM_HEADS 4
#define NUM_SECTORS_PER_TRACK 10

// 将逻辑块号转换为CHS地址
void block_to_chs(int logical_block, int *cylinder, int *head, int *sector) {
    *cylinder = logical_block / (NUM_HEADS * NUM_SECTORS_PER_TRACK);
    int remaining = logical_block % (NUM_HEADS * NUM_SECTORS_PER_TRACK);
    *head = remaining / NUM_SECTORS_PER_TRACK;
    *sector = remaining % NUM_SECTORS_PER_TRACK;
}

int main() {
    int logical_block = 523;  // 例如,要转换的逻辑块号

    int cylinder, head, sector;
    block_to_chs(logical_block, &cylinder, &head, &sector);

    printf("Logical Block: %d\n", logical_block);
    printf("CHS Address: Cylinder %d, Head %d, Sector %d\n", cylinder, head, sector);

    return 0;
}

在这个示例中,block_to_chs 函数接受逻辑块号作为输入,并计算出相应的柱面(cylinder)、磁头(head)和扇区(sector)。这个函数假设一个虚拟的CHS磁盘,其中柱面、磁头、扇区都以0开始计数。

4.遍历EXT2文件系统树

遍历EXT2文件系统树的方法可以分为以下几个步骤。在这个过程中,我们将使用文件系统的数据结构和文件操作来获取文件和目录的信息。

  1. 读取超级块信息:

    • 打开设备文件,这可以是磁盘分区或磁盘镜像文件。
    • 读取超级块信息,验证是否为EXT2文件系统。超级块包含文件系统的关键参数,如块大小、块组数量、索引节点数量等。
  2. 读取根目录索引节点:

    • 使用超级块信息找到根目录的索引节点(通常是索引节点号2)。
    • 读取根目录的索引节点,获取根目录的数据块地址。
  3. 遍历根目录:

    • 从根目录的数据块开始,逐个读取目录条目(dir_entry)。
    • 目录条目中包含了子文件和子目录的信息,包括文件名和对应的索引节点号。
    • 遍历根目录的所有目录条目,处理每个子文件和子目录。
  4. 递归遍历子目录:

    • 如果一个目录条目指向一个子目录,那么需要递归进入这个子目录并重复步骤3。
    • 递归的基本情况是当目录条目中的文件名为 "."".." 时,它们分别表示当前目录和父目录,应该被跳过。
  5. 处理文件和目录信息:

    • 对于每个文件和目录,你可以获取它们的属性和信息,如文件名、文件类型、大小、权限等。
    • 可以将这些信息保存在一个数据结构中,以供后续使用或显示给用户。

5、基本文件系统

  • type.h文件包含了EXT2文件系统的数据结构类型,如超级块、组描述符、索引节点和目录条目结构。
  • global.c文件包含文件系统的全局变量,如内存中的INODE、挂载表、打开文件表和PROC结构体。
  • 实用程序函数包括get_blockput_block用于读写文件系统块,igetiput用于管理内存中的INODE,以及getino用于根据路径名查找索引节点号。

6、文件系统的级别

文件系统的实现分为三个级别,每个级别处理文件系统的不同部分:

  • 1级文件系统函数处理文件和路径的基本操作,如创建、删除、打开、关闭等。
  • 2级文件系统函数涉及文件的读取和写入操作。
  • 3级文件系统函数负责文件系统的挂载、卸载和文件保护等高级操作。
    这些级别的划分有助于模块化文件系统的实现,使其更容易理解和维护。

7、文件系统项目的扩展

简单的EXT2文件系统使用1KB块大小,只有一个磁盘块组它可以轻松进行以下扩展。

  • 多个组:组描述符的大小为32字节对于1KB大小的块,一个块可能包含
    1024/32=32组描述符。32个组的文件系统大小可以扩展为32*8=256MB

  • 4KB大小的块:对于4KB大小的块和一个组,文件系统大小应为48=32MB。
    对于一个组描述符块,文件系统可能有128个组,可将文件系统大小扩展到128
    32=4GB
    对于2个组描述符块,文件系统大小为8GB等。大多数扩展都很简单,适合用于编程项目。

  • 管道文件:管道可实现为普通文件,这些文件遵循管道的读/写协议。此方案的优点是:它统一了管道和文件索引节点,并允许可被不相关进程使用的命名管道。为支持快速读/写操作,管道内容应在内存中,比如在 RAMdisk中。必要时,读者可将命名管道实现为FIFO文件。

  • I/O缓冲:在编程项目中,每个磁盘块都是接读写的。这会产生过多的物理磁盘I/O操作。为提高效率,实际文件系统通常使用一系列I缓冲区作为磁盘块的缓存内存。文件系统的IO缓冲将会在第12章中讨论,但是可把它合并到文件系统.

二、ChatGpt提问








三、实践及代码托管

(1)手动实现mkdir

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>

int main(void) {
    int status;
    printf("Please input the name of directory: ");
    char s[100];

    // 使用fgets安全地获取用户输入
    if (fgets(s, sizeof(s), stdin) != NULL) {
        // 使用strtok去掉输入中的换行符
        s[strcspn(s, "\n")] = '\0';

        status = mkdir(s, 0777); // 创建目录,0777表示具有最高权限
        if (!status) {
            printf("Directory created\n");
        } else {
            printf("Unable to create directory\n");
        }

        // 使用ls命令来显示目录内容
        printf("Contents of the directory:\n");
        char ls_command[200];
        snprintf(ls_command, sizeof(ls_command), "ls -l %s", s);
        system(ls_command);
    } else {
        printf("Error reading input\n");
    }

    return 0;
}

(2)手动实现rmdir

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>

int deleteDirectory(const char *path) {
    int status = rmdir(path);
    return status;
}

int main(void) {
    int status;
    printf("Please input the name of directory: ");
    char s[100];

    // 使用fgets安全地获取用户输入
    if (fgets(s, sizeof(s), stdin) != NULL) {
        // 使用strtok去掉输入中的换行符
        s[strcspn(s, "\n")] = '\0';

        status = deleteDirectory(s);

        if (!status) {
            printf("\n\nDirectory deleted\n");
        } else {
            perror("Unable to delete directory");
        }

        // 使用ls命令来显示删除后的目录内容
        printf("Contents of the current directory:\n");
        system("ls -l");
    } else {
        printf("Error reading input\n");
    }

    return 0;
}


代码已托管至gitee,具体链接:https://gitee.com/wang-yuxuan333/123.git
分别为mymkdir.txt myrmdir.txt

四、问题及解决

原代码的一些函数库已经不被使用,通过ChatGpt修改代码,最终成功运行。

标签:文件,EXT2,int,第十一章,信息安全,文件系统,笔记,printf,block
From: https://www.cnblogs.com/wyx235300/p/17707081.html

相关文章

  • [学习笔记] ex-KMP
    简介exKMP(扩展KMP算法),也叫Zalgorithm(Z算法),可以在\(\mathcal{O}(|s|+|t|)\)求解文本串\(s\)的所有后缀与匹配串\(t\)的最长公共前缀(LCP)。实现定义一个长度为\(n\)的字符串\(s\)的\(z\)函数\(z_i\)表示\(s\)长度为\(i\)的后缀与自身的最长公共前缀的长度......
  • [学习笔记] 线性基
    线性基是向量空间的一组基,通常可以解决有关异或的一些题目。——OIWiki线性基就是从初始集合中选出的一个子集,它满足一些性质,可以处理一些问题(屁话)。性质线性基中每个元素二进制下最高位是不同的。线性基中没有异或和为\(0\)的子集。线性基中任意子集中元素异或和的值......
  • [学习笔记] 树链剖分
    叫复习笔记或许更好。树链剖分就是把树剖成链去解决一些问题。定义重子节点:子节点中子树大小最大的节点。轻子节点:除重子节点外的其他子节点。重边:到重子节点的边。轻边:到轻子节点的边。记号\(dfn[x]\):DFS序,也是在线段树中的编号。\(son[x]\):重子节点。\(dep[x]\)......
  • [学习笔记] Tarjan 连通性全家桶
    拜谢陈老师的PPT!!!无向图割点若点\(x\)不为搜索树的根节点,则\(x\)是割点当且仅当搜索树上存在一个\(x\)的子节点\(y\)满足:\(dfn_x\lelow_y\)。特别地,当\(x\)是搜索树的根节点时,则\(x\)是割点当且仅当有两个点\(y_1,y_2\)满足上述条件。割边边\((x,y)\)是......
  • 笔记——线段树
    蓝月の笔记——线段树篇在树状数组中,我们讲解了关于单点修改区间查询的操作。今天,我们要讲一种更加高级的数据结构,他解决的是区间修改区间查询的问题多了一个区间当然更高级啦。这个数据结构就是——线段树Luogu-P3372给定一个长度为\(n\)的序列\(a_1,a_2,\cdots,a_n\)......
  • Linux运维学习笔记
    此笔记为学习https://www.bilibili.com/video/BV1nW411L7xm/?vd_source=3f851e85e66ef33269a2eefee664cec2的学习记录,目前持续更新中,希望能找到运维的实习吖 O(≧▽≦)OLinux的终端终端组成部分Linux关机命令shoutdown-hnow(正常关机)halt(关闭内存)init0使用VMware备......
  • 活动报名与缴费小程序开发笔记一
    项目背景活动报名与缴费小程序的开发背景主要源于以下几个因素:1.数字化时代的需求:随着移动互联网和智能手机的普及,人们习惯使用手机进行各种活动。传统的纸质报名表格和线下缴费方式变得相对繁琐,而数字化报名与缴费小程序提供了更便捷的解决方案。2.提高效率和减少人力成本:对于活......
  • 流畅的python笔记 (二) 2.序列构成的数组
    内置序列类型分类1:容器序列(能存放不同类型):list,tuple,collections.deque扁平序列(不能存放不同类型):str,bytes,bytearray,memoryview,array.array分类2:可变序列(能被修改):list,bytearray,array.array,collections.deque,memoryview不可变序列:tuple,str,bytes列表推导......
  • Python笔记
    第一章、Python概述1.1 扩展库安装方法使用pip命令安装扩展库。在cmd命令行中输入pip,回车后可以看到pip命令的使用说明。1.2 常用的pip命令pip命令示例说明pipfreeze[>requirements.txt]列出已安装扩展库及其版本号(不知道怎么用。。?)pipinstallSomePacka......
  • 【做题笔记】dp,但是国庆限定版
    Day1方块消除传送门看到这个数据范围就可以猜测正解是\(O(n^4)\)的dp,与这个差不多相符合的可以想到区间dp。然后大胆猜测一下就是区间dp,令\(dp[i][j]\)表示消除掉\([i,j]\)后的最大价值,这个显然可以从长度更短的区间转移过来。所以此题我们可以从区间dp的方向思考......