5

c 生成 ext2 文件(直接寻址) - 1

 3 years ago
source link: https://blog.popkx.com/c-generate-a-ext2-file-1/
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 文件(直接寻址) - 1

发表于 2018-05-11 15:05:00   |   已被 访问: 436 次   |   分类于:   文件系统   |   暂无评论
上一节,我们写了 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
  • 成功了,一切符合预期。

阅读更多:   文件系统


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK