首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将内核内存写入ext2块

将内核内存写入ext2块
EN

Stack Overflow用户
提问于 2011-10-26 17:12:46
回答 2查看 1.1K关注 0票数 6

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

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

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

我看过do_sync_write的实现,但我不太确定如何复制它所做的事情,而是使用内核内存。

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

代码语言:javascript
复制
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字节长。如果它是一个快速的符号链接,那么数据被存储在块指针中。这很容易做到,我已经为常规文件实现了这一点。如果链接不是快速符号链接,则数据的处理方式与常规文件相同。我想我又回到原点了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-04 08:34:37

我设法把它弄明白了。它需要获取struct buffer_head实例并在其中读/写数据。通过循环遍历逻辑块编号并使用to ext2_get_block来检索块(如果需要,可以分配它们),然后使用sb_getblk获取实际的缓冲区并对其进行写入。我已经在my blog上发布了一个实现。

票数 1
EN

Stack Overflow用户

发布于 2011-11-04 09:32:31

愚蠢的家庭作业。

代码不起作用。尝试mmap()并终止。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7900723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档