上一节,我们用 c 添加了初始文件 xrk,采用的方法是在根目录的 block[0] 的末尾添加 xrk 的文件信息。不过,每个 inode 的 block[0~11] 都是直接寻址,是否可以直接使用 block[1~11] 添加文件呢?
- 本节计划使用根目录 inode 的 block[1~11] 实现文件的添加。
计划添加 xrk1~11,里面均添加内容 www.xrkxzz.cn。
因为前 21 个数据块和前 2 个 inode 已经被使用,所以我们从第 22 个数据块和第 3 个 inode 开始。
以根目录的 block[1] 为例:
· 我们首先设置 block[1] = 22。
· 在第 22 个块中写入 xrk1 的 inode 信息(inode3)。
· 在第 3 个 inode 中写入 xrk1 的数据块 23(顺延)。
· 最后,在第 23 个块中写入 www.xrkxzz.cn。
- 余下的根目录 inode 的 block[2~11] 均按此思路写。函数如下:
void GenFiles()
{
int i = 0, j = 1; // j=1 是因为 根目录的 inode.block[0] 被自己的 . 和 .. 占用了
sDataBlock sdtmp;
sInode sitmp;
char name[5] = {0};
int startBlock = 22;
int startInode = 3;
char buf[] = "www.xrkxzz.cn\n";
while(j<12){
memset(name, 0, 5);
sprintf(name, "xrk%d", j);
printf("name : %s -- startBlock: %d\n", name, startBlock);
// 根目录指向的数据块
sdtmp.inodeIndex = startInode++; // 第三个 inode
sdtmp.recordLen = s_sprBlk.blockSize;
sdtmp.fileNameLen = (j<10)?4:5;
sdtmp.fileType = 1;
strcpy(sdtmp.fileName, name);
sLoadDataBlock(startBlock++, 0, &sdtmp);
// inode
sitmp.st_mode = 0x81A4;
sitmp.user = 0x0;
sitmp.size = s_sprBlk.blockSize;
sitmp.atime = 0x4764cc3b;
sitmp.ctime = 0x4764cc3b;
sitmp.mtime = 0x4764cc3b;
sitmp.dtime = 0x4764cc3b;
sitmp.group = 0;
sitmp.links = 1;
sitmp.ocupiedBlocks = 2;
sitmp.flags = 0;
sitmp.osInfo = 0;
sitmp.blocks[0] = startBlock++;
for(i=1; i<15; i++)
sitmp.blocks[i] = 0;
sLoadInode(sdtmp.inodeIndex, &sitmp);
// inode 指向的数据块
MFileWriteStringInByte( sitmp.blocks[0]*s_sprBlk.blockSize, buf);
//将对应的位图置 1
sSetBlockBmp(sitmp.blocks[0]);
j++;
}
}
- 根目录 inode 的如下:
sitmp.st_mode = 0x41ed;
sitmp.user = 0x0;
sitmp.size = s_sprBlk.blockSize*12; // ************ 非常重要,如果想用 2 个 sitmp.blocks,则至少的 2 个块吧,很好理解
sitmp.atime = 0x4764cc3b; // 最好是让 乘数因子 等于 实际用的 inode.blocks
sitmp.ctime = 0x4764cc3b;
sitmp.mtime = 0x4764cc3b;
sitmp.dtime = 0x4764cc3b;
sitmp.group = 0;
sitmp.links = 1;
sitmp.ocupiedBlocks = 2;
sitmp.flags = 0;
sitmp.osInfo = 0;
sitmp.blocks[0] = 21; sitmp.blocks[1] = 22;
for(i=2; i<13; i++)
sitmp.blocks[i] = sitmp.blocks[1]+2*(i-1);
sitmp.blocks[13] = 0;
sitmp.blocks[14] = 0;
- 在 main 函数中添加此函数的调用,编译运行,并且挂载到 linux,查看结果如下:
$ sudo mount -o loop disk /mnt
$ ls /mnt
xrk1 xrk10 xrk11 xrk2 xrk3 xrk4 xrk5 xrk6 xrk7 xrk8 xrk9
$ cat /mnt/xrk11
www.xrkxzz.cn
$ sudo umount /mnt
- 成功了,一切符合预期。
[…] c 生成 ext2 文件 – 2 […]