gpt4 book ai didi

c - 将内核内存写入 ext2 block

转载 作者:太空狗 更新时间:2023-10-29 17:25:51 26 4
gpt4 key购买 nike

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

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

当文件增长到大于 60 字节时,我需要将 inode 的 block 指针数组中当前的所有数据复制到实际 block 中。所以,我需要将内核内存写入 ext2 block 。对 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);

编辑:

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

最佳答案

我设法弄清楚了。它需要获取 struct buffer_head 实例并在其中读取/写入数据。通过遍历逻辑 block 号并使用 ext2_get_block 检索 block (如有必要,分配它们),然后使用 sb_getblk 获取真正的缓冲区并写入它。我在 my blog 上发布了一个实现.

关于c - 将内核内存写入 ext2 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7900723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com