上一节,我们写了 ext2 的格式化函数,格式化后的 disk 能够被 linux 挂载并且正常使用。
本节,将用 c 生成的初始文件。依然以 xrk 文件为例,里面写入 www.xrkxzz.cn。
如果要在根目录下创建新的文件,可以把第三条记录截短,在原来的 0 字节处创建新的记录。
- 本节计划在上一节的基础上,按照上述方法添加初始文件 xrk,其实就是填表,把根目录的 block[0] 对应的数据块重写,在末尾添加 xrk 信息,比较简单,下面直接上代码:
// 在根目录创建个 xrk 文件,里面写入 www.xrkxzz.cn
void GenAFile()
{
int i = 0;
// 写第 3 个 inode // 使用 第 3 个 inode 作为 xrk 的 inode
sInode sitmp;
sitmp.st_mode = 0x81A4;
sitmp.user = 0x0;
sitmp.size = 1024;
sitmp.atime = 0x4764cc3b;
sitmp.ctime = 0x4764cc3b;
sitmp.mtime = 0x4764cc3b;
sitmp.dtime = 0x4764cc3b;
sitmp.group = 0;
sitmp.links = 1; // 必须不为 0,否则文件不会被识别
sitmp.ocupiedBlocks = 2;
sitmp.flags = 0;
sitmp.osInfo = 0;
sitmp.blocks[0] = 23; // 使用第 23 个块做数据块
for(i=1; i<15; i++)
sitmp.blocks[i] = 0;
sLoadInode(3, &sitmp); // 使用 第 3 个 inode 作为 xrk 的 inode
// 第 23 个数据块
char buf[] = "www.xrkxzz.cn\n";
MFileWriteStringInByte( 23*1024, buf);
//将对应的位图置 1
sSetAddrBitN(1024*s_grpDescrpt.blockBmLoc, 23);
// 更新超级块和块组描述符 freeBlocks
sUpdateFreeBlocks();
// 写根目录的 datablock,把 xrk 文件加入
sDataBlock sdtmp;
sdtmp.inodeIndex = 3;
sdtmp.recordLen = 12;
sdtmp.fileNameLen = 1;
sdtmp.fileType = 2;
strcpy(sdtmp.fileName, ".");
sLoadDataBlock(21, 0, &sdtmp);
sdtmp.fileNameLen = 2;
sdtmp.recordLen = 12;
memset(sdtmp.fileName, 0, sizeof(sdtmp.fileName));
strcpy(sdtmp.fileName, "..");
sLoadDataBlock(21, 12, &sdtmp);
sdtmp.inodeIndex = 3; // 第三个 inode
sdtmp.fileNameLen = 3;
sdtmp.recordLen = 1024-24;
memset(sdtmp.fileName, 0, sizeof(sdtmp.fileName));
strcpy(sdtmp.fileName, "xrk");
sLoadDataBlock(21, 24, &sdtmp);
}
- 函数比较简单,编译后运行,挂载到linux后,查看结果如下:
$ sudo mount -o loop disk /mnt
$ ls /mnt
xrk # 生成的文件
$ cat /mnt/xrk
www.xrkxzz.cn # 我们写入的内容
$ sudo umount /mnt
[…] c 生成 ext2 文件 – 1 […]