头歌操作系统 课堂练习7.1:文件系统的静态结构 答案及解析

全实验仅用到一个Linux命令——hexdump,有关该命令,详见文章:

Linux常用命令——hexdump命令-CSDN博客

第一关

1.在超级块中,i 节点位图所占的块数是多少?区块位图所占的块数是多少?数据区的第一个区块的编号是多少?索引节点区的第一个数据块的编号和起始地址是多少?

由图可知,超级块位于第2个块(1号块),每块大小为1024B,因此超级块起始地址为0x400

显示0x400开始的内容(超级块):

hexdump -s 0x400 -n 1024 -C rootimage-0.11

由上表对照可获得下表数据:

字段名称

十六进制

十进制

i节点数

0x0d60

3,424

区块数

0x2800

10,240

i节点位图所占块数

0x1

1

逻辑块位图所占块数

0x2

2

数据区中第一个逻辑块块号

0x70

112

后面内容做了省略。

索引节点(i节点,inode)区的第一个数据块的编号:

1(引导块) + 1(超级块) + 1i节点位图1块) + 2(逻辑块位图2块) = 5

索引节点(i节点,inode)区的第一个数据块的起始地址:

0x400 * 5 = 0x1400

1 号索引节点的第一个区块的编号和起始地址分别是多少?

由上表可知i_zone[0]在索引节点的位置:

2(i_mode) + 2(i_uid) + 4(i_size) + 4(i_mtime) + 1(i_gid) + 1(i_nlinks) = 14

显示0x1400开始的内容(1号索引节点):

hexdump -s 0x1400 -n 32 rootimage-0.11

得到1号索引节点的第一个区块号:0x70

地址:0x400 * 0x70 = 0x1c000

2.目录 /usr 的索引节点的编号和起始地址分别是多少?

由上图可知,i节点号位于文件名的前2Byte,可据此快速定位。

显示0x1c000开始的内容(根目录):

hexdump -s 0x1c000 -n 1024 -C rootimage-0.11

从ASCII码的解码可以找到/usr目录的位置,从而获得/usr的索引节点号为0x30

由于每一个索引节点长度为32,因此可根据如下公式计算/usr索引节点的地址:

0x1400 + 32 * (0x30 - 1) = 0x19e0

3.目录 /usr 的索引节点的第一个区块的编号和起始地址分别是多少?

显示0x19e0开始的内容(/usr索引节点):

hexdump -s 0x19e0 -n 32 rootimage-0.11

/usr的第一个区块的编号0x3db

地址:0x400 * 0x03db = 0xf6c00

4.目录 /usr/root 的索引节点的编号和起始地址分别是多少?

显示从0xf6c00开始的内容(/usr目录):

hexdump -s 0xf6c00 -n 1024 -C rootimage-0.11

从ASCII码的解码可以找到/usr/root目录的位置,从而获得/usr/root的索引节点号为0x83

地址:0x1400 + 32 * (0x83 - 1) = 0x2440

显示从0x2440开始的内容(/usr/root索引节点):

hexdump -s 0x2440 -n 32 rootimage-0.11

/usr/root的第一个区块的编号0x1271

地址:0x400 * 0x1271 = 0x49c400

5.文件 /usr/root/hello.c 的索引节点的第一个区块的编号和起始地址分别是多少?

显示从0x49c400开始的内容(/usr/root目录):

hexdump -s 0x49c400 -n 1024 -C rootimage-0.11

从ASCII码的解码可以找到/usr/root/hello.c目录的位置,从而获得/usr/root/hello.c的索引节点号为0x86

地址:0x1400 + 32 * (0x86 - 1) = 0x24a0

显示从0x24a0开始的内容(/usr/root/hello.c索引节点):

hexdump -s 0x24a0 -n 32 rootimage-0.11

/usr/root/hello.c的第一个区块的编号0x1287

地址:0x400 * 0x1287 = 0x4a1c00

6.文件 /usr/root/hello.c 的头两个字节是什么?

显示从04a1c00开始的内容(/usr/root/hello.c文件):

头两个字节分别为0x23 0x69

用图片可以很好地总结:

答案:

1.在超级块中,i 节点位图所占的块数是多少?(1)区块位图所占的块数是多少?(2)数据区的第一个区块的编号是多少?(0x70)索引节点区的第一个数据块的编号和起始地址是多少?(5)(0x1400)

2.1 号索引节点的第一个区块的编号和起始地址分别是多少?(0x70)(0x1c000)

3.目录 /usr 的索引节点的编号和起始地址分别是多少?(0x30)(0x19e0)

4.目录 /usr 的索引节点的第一个区块的编号和起始地址分别是多少?(0x03db)(0xf6c00)

5.目录 /usr/root 的索引节点的编号和起始地址分别是多少?(0x83)(0x2440)

6.目录 /usr/root 的索引节点的第一个区块的编号和起始地址分别是多少?(0x1271)(0x49c400)

7.文件 /usr/root/hello.c 的索引节点的编号和起始地址分别是多少?(0x86)(0x24a0)

8.文件 /usr/root/hello.c 的索引节点的第一个区块的编号和起始地址分别是多少?(0x1287)(0x4a1c00)

9.文件 /usr/root/hello.c 的头两个字节是什么?(0x23)(0x69)

第二关

1.目录 /etc 的索引节点的编号和起始地址分别是多少?

由第1关可知,根目录(/)起始地址从0x1c000开始

显示0x1c000开始的内容(根目录):

hexdump -s 0x1c000 -n 1024 -C rootimage-0.11

从ASCII码的解码可以看出,/etc的索引节点号为0x23

地址:0x1400 + 32 * (0x23 - 1) = 0x1840

2.目录 /etc 的索引节点的第一个区块的编号和起始地址分别是多少?

显示0x1840开始的内容(/etc索引节点):

hexdump -s 0x1840 -n 32 rootimage-0.11

/etc的第一个区块的编号0x03b7

地址:0x400 * 0x03b7= 0xedc00

3.文件 /etc/magic 的索引节点的编号和起始地址分别是多少?

显示0xedc00开始的内容(/etc目录):

hexdump -s 0xedc00 -n 1024 -C rootimage-0.11

从ASCII码的解码可以找到/etc/magic目录的位置,从而获得/etc/magic的索引节点号为0x2a

地址:0x1400 + 32 * (0x2a - 1) = 0x1920

由上图可知,zone[7]是一次间接块号,zone[8]是二次(双重)间接块号。

显示0x1920开始的内容(/etc/magic索引节点):

hexdump -s 0x1920 -n 32 rootimage-0.11

可得:

/etc/magic的第一个区块的编号0x3c9

/etc/magic 的一次间接块号0x03d0

/etc/magic的二次间接块号 N/A

地址:

0x400 * 0x3c9 = 0xf2400      第一个区块

0x400 * 0x03d0 = 0xf4000    一次间接块

4.文件 /etc/magic 的索引节点的最后一个区块的编号和起始地址分别是多少?

显示0xf4000开始的内容(/etc/magic文件的一次间接块):

hexdump -s 0xf4000 -n 32 -C rootimage-0.11

/etc的最后一个区块的编号0x03d5

地址:0x400 * 0x03d5 = 0xf5400

5.文件 /etc/magic 的尾部包含字符串XENIX 8086 relocatable or 80286 small model,其起始地址是什么?

显示0xf5400开始的内容(/etc/magic文件最后一个区块):

hexdump -s 0xf5400 -n 1024 -C rootimage-0.11

从ASCII码的解码可以看出,XENIX 8086 relocatable or 80286 small model的首字母“X”的地址:0xf55e0 + 13 = 0xf55ec

用图片可以很好地总结:

答案:

1.目录 /etc 的索引节点的编号和起始地址分别是多少?(0x23)(0x1840)

2.目录 /etc 的索引节点的第一个区块的编号和起始地址分别是多少?(0x03b7)(0xedc00)

3.文件 /etc/magic 的索引节点的编号和起始地址分别是多少?(0x2a)(0x1920)

4.文件 /etc/magic 的索引节点的最后一个区块的编号和起始地址分别是多少?(0x3d5)(0xf5400)

5.文件 /etc/magic 的尾部包含字符串 XENIX 8086 relocatable or 80286 small model ,其起始地址是什么?(0x000f55ec)

总结:

这里引用CSDN作者@歌者`的一张图,可以直观表示:

  • 15
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值