c 生成 ext2 文件(间接寻址) – 3

前面两节,我们用 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);

}
  • 编译执行,挂载到 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 识别。(看上一节最后说明)


阅读更多:   文件系统
添加新评论

icon_redface.gificon_idea.gificon_cool.gif2016kuk.gificon_mrgreen.gif2016shuai.gif2016tp.gif2016db.gif2016ch.gificon_razz.gif2016zj.gificon_sad.gificon_cry.gif2016zhh.gificon_question.gif2016jk.gif2016bs.gificon_lol.gif2016qiao.gificon_surprised.gif2016fendou.gif2016ll.gif