【问题标题】:Writing kernel memory to ext2 block将内核内存写入 ext2 块
【发布时间】:2011-12-15 14:08:15
【问题描述】:

对于大学作业,如果文件小于 60 字节,我们必须修改 ext2 文件系统以将文件存储在 inode 的块指针中,并在文件增长到大于 60 字节时转移到常规块存储。

我从 2.6 linux 内核源代码中复制了 ext2 代码(按照说明)并从那里开始。

当文件大于 60 字节时,我需要将当前在 inode 的块指针数组中的所有数据复制到实际块中。所以,我需要将内核内存写入 ext2 块。对do_sync_write 的简单调用在这里不起作用,因为它占用了用户空间内存。

我查看了do_sync_write 的实现,但我不确定如何复制它的功能,而是使用内核内存。

这是我当前对此特定部分的实现(不起作用):

ssize_t extmod_write(struct file *filp, const char *buf,
            size_t len, loff_t *ppos)
{
...
printk(KERN_INFO "Switching to regular file");
temp = kmalloc(inode->i_size, GFP_KERNEL);
memcpy(temp, EXT2_I(inode)->i_data, inode->i_size);

/* Need to clear the block pointers before they are allocated by kernel */
memset(EXT2_I(inode)->i_data, 0, sizeof(EXT2_I(inode)->i_data));

if (do_sync_write(filp, temp, inode->i_size, &dummy) < 0) {
    printk(KERN_INFO "DAMN! Writing current buffer failed");
    return -EINVAL;
}
kfree(temp);
return do_sync_write(filp, buf, len, ppos);

编辑:

我查看了符号链接。基本上,ext2 具有“快速符号链接”的概念;即链接名称的长度小于 60 字节。如果它是快速符号链接,则数据将存储在块指针中。这很容易做到,我已经为常规文件实现了这一点。如果链接不是快速符号链接,则数据的处理方式与常规文件相同。我想我又回到了原点。

【问题讨论】:

  • 提示:看看符号链接。 IIRC 它们也存储在 inode 中,只要大小足够小。
  • 是的,我可以看到他们只是在哪里memcpy 链接名称到EXT2_I(inode)-&gt;i_data。我的问题是,如果您想将该数据复制到一个块中怎么办。 ext2 模块的通用方式需要用户数据。
  • 我不是在做你的作业或阅读,只是给你一个提示。看看当有效负载变得太大而无法放入 inode 时,符号链接代码会做什么。显然,必须分配一个磁盘块,并且需要初始化 inode 块指针以指向它。不提位图(不知道ext2有没有)
  • 谢谢,wildplasser,我没想到你会这样做!我注意到符号链接的行为方式与我希望文件的行为方式相同,尽管它都是“特定于符号链接的”。

标签: c filesystems linux-kernel ext2


【解决方案1】:

我设法弄明白了。它需要获取struct buffer_head 实例并读取/写入其中的数据。通过循环访问逻辑块编号并使用 toext2_get_block 检索块(必要时分配它们),然后使用sb_getblk 取出真正的缓冲区并写入它。我已经在my blog 上发布了一个实现。

【讨论】:

    【解决方案2】:

    愚蠢的家庭作业。

    代码不起作用。试试 mmap() 然后死掉。

    【讨论】:

      猜你喜欢
      • 2021-07-20
      • 2013-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多