15

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

 4 years ago
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.
neoserver,ios ssh client

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

发表于 2018-05-11 16:05:00   |   已被 访问: 312 次   |   分类于:   文件系统   |   暂无评论
前面两节,我们用 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 识别。(看上一节最后说明)


阅读更多:   文件系统


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK