前面两节,我们用 c 生成了初始文件,但是,使用的都是 ext2 的直接寻址。那么,使用 ext2 文件系统的间接寻址的怎么生成初始文件呢?
计划生成初始文件 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);
}
$ 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 识别。(看上一节最后说明)