6

大学の課題では、ext2ファイルシステムを変更して、ファイルが60バイト未満の場合はiノードのブロックポインターにファイルを保存し、ファイルがそれより大きくなると通常のブロックストレージに移動する必要があります。

2.6 linuxカーネルソースからext2コードをコピーし(指示どおり)、そこから移動しました。

ファイルが60バイトより大きくなると、現在iノードのブロックポインタ配列にあるデータを実際のブロックにコピーする必要があります。したがって、カーネルメモリを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バイト未満です。高速シンボリックリンクの場合、データはブロックポインタに格納されます。これは簡単に実行でき、通常のファイルにはすでに実装しています。リンクが高速シンボリックリンクでない場合、データは通常のファイルと同じ方法で処理されます。私は正方形に戻ったと思います。

4

2 に答える 2

1

ばかげた宿題。

コードが機能しません。mmap()を試して死ぬ。

于 2011-11-04T01:32:30.900 に答える
1

私はなんとかそれを理解することができました。struct buffer_headインスタンスを取得し、その中のデータを読み書きする必要がありました。論理ブロック番号をループし、toを使用しext2_get_blockてブロックを取得し(必要に応じてそれらを割り当てます)、次にを使用sb_getblkして実際のバッファーを取り出して書き込みます。ブログに実装を投稿しました。

于 2011-11-04T00:34:37.193 に答える