

c 生成 ext2 文件(间接寻址) – 3
source link: https://blog.popkx.com/c-generate-a-ext2-file-3/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

c 生成 ext2 文件(间接寻址) – 3
前面两节,我们用 c 生成了初始文件,但是,使用的都是 ext2 的直接寻址。那么,使用 ext2 文件系统的间接寻址的怎么生成初始文件呢?
- 在 ext2 数据块寻址 小节,我们知道 inode 的 block[0~11] 是直接寻址,block[12~14] 分别是一级、二级、三级间接寻址。c 生成 ext2 文件 – 1 和 c 生成 ext2 文件 – 2 两节,我们使用的都是直接寻址,本节将使用根目录 inode 的 block[12] 实现一级间接寻址生成初始文件。
计划生成初始文件 xrkIndirct,并写入内容 www.xrkxzz.cn。
- 主要步骤如下:
· 根目录的 inode 的 size 属性增大,因为添加了新文件。
· 根目录的 inode 的 block[12] 设置为 44。
· 第 44 个块不是 block[12] 的数据块,而是间接寻址块。
· 第 44 块的前 4 个字节是 block[12] 的第一个间接索引,设置为 45.
· 第 45 块即为 block[12] 的数据块,在里面写入 xrkIndirct 的 inode (14)信息。
· 将 xrkIndirct 的 inode 的 block[0] 设置为 46,则第 46 块即为 xrkIndirct 的数据块。
· 在第 46 块中写入 www.xrkxzz.cn。
- 以下是该函数的源代码
// 利用 1 级间接寻址,创建文件 xrkIndirct,并且写入数据 www.xrkxzz.cn
void IndirectlyGenAFile()
{
int i = 0;
printf("------------indirectly gen a file -------\n");
// 第 44 个块,应该还不是 inode4 的数据块,而是间接索引,记得去把根目录的 inode.size 改大一点
uint32 indirAddr = 45; //用第 45 块作为 inode4 的数据块
MFileWriteUint32InByte(44*1024, indirAddr);
// MFileWriteUint32InByte(44*1024+8, 51);
sSetBlockBmp(44);
// 第 45 个块,应该是根目录 inode block[12] 的数据块了
sDataBlock sdtmp;
sdtmp.inodeIndex = 14; // 第14个 inode
sdtmp.recordLen = 1024;
sdtmp.fileNameLen = 10;
sdtmp.fileType = 1;
strcpy(sdtmp.fileName, "xrkIndirct");
sLoadDataBlock(indirAddr, 0, &sdtmp);
// 写 inode14
sInode sitmp;
sitmp.st_mode = 0x814a;
sitmp.user = 0x0;
sitmp.size = 1024;
sitmp.atime = 0x4764cc3b;
sitmp.ctime = 0x4764cc3b;
sitmp.mtime = 0x4764cc3b;
sitmp.dtime = 0x4764cc3b;
sitmp.group = 0;
sitmp.links = 5;
sitmp.ocupiedBlocks = 2;
sitmp.flags = 0;
sitmp.osInfo = 0;
sitmp.blocks[0] = 46; // 第 46 个块用来存储数据
for(i=1; i<15; i++)
sitmp.blocks[i] = 0;
sLoadInode(14, &sitmp);
// 第 46 个数据块
char buf[] = "www.xrkxzz.cn\n";
MFileWriteStringInByte( 46*1024, buf);
//将对应的位图置 1
sSetBlockBmp(46);
}
- 编译执行,挂载到 linux,查看结果如下:
$ sudo mount -o loop disk /mnt
$ ls /mnt
xrk1 xrk11 xrk3 xrk5 xrk7 xrk9
xrk10 xrk2 xrk4 xrk6 xrk8 xrkIndirct
$ cat /mnt/xrkIndirct
/mnt/xrkIndirct
www.xrkxzz.cn
$ sudo umount /mnt
- 成功了,一切符合预期。
再强调一下,ext2 的使用,要按照顺序来。如果直接寻址没有使用完,间接寻址是没法被linux识别的。间接寻址的索引也是如此,要先用前 4 个字节,再用第二个 4 字节,以此类推,不能跳着使用,否则无法被linux 识别。(看上一节最后说明)
阅读更多: 文件系统
Recommend
-
14
c 生成 ext2 文件(直接寻址) – 2 发表于 2018-05-11 16:05:00...
-
8
c 生成 ext2 文件(直接寻址) - 1 发表于 2018-05-11 15:05:00...
-
10
ext2 文件属性分析 发表于 2018-05-03 16:05:00...
-
8
ext2 文件系统的结构 发表于 2018-05-03 16:05:00...
-
14
ext2 数据块寻址方式 发表于 2018-05-03 18:05:00...
-
6
ext2 实例剖析,详解文件的存储方式 发表于 2018-05-03 17:05:00...
-
7
Java 如何直接或间接生成 CDR 文件 V2EX › Java Java 如何直接或间接生成 CDR 文件
-
10
linux上ext2文件系统中,用debugfs来恢复被删除的文件 浏览:2705次 出处信息 如果你不小心用rm -rf xxx删除了...
-
5
EXT2文件系统结构 发表于 2017-12-28 | 分类于 其他 | | 浏览3 次 | 字数统计: 2.6k | 阅读时长 ≈ 9EXT2第二代扩展文件系统(英语:second extended filesystem,缩写为...
-
2
寄存器间接寻址寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令:LDR R0,[R1] /*R0←[R1]*/ STR R0,[R1] /*[R1]←R0*/...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK