5

Unix バージョン 6 の最新の実装であるxv6で少し遊んでいます。

私の最初のハックでは、単純な syscall を実装したかったのgetcwdですが、どのレベルの抽象化を使用すればよいかについて少し迷っています。

  • struct fileインターフェイスを使用する必要がありますか?
  • それともstruct inodeインターフェイス?
  • 重要なのは、純粋にユーザーランドに実装することさえできるようです。

struct inode私は操作でそれを実装し始めました。私の素朴な考えは、 を取得しproc->cwd、次にreadi()その 2 番目のエントリ ( ..) を取得し、それをスキャンして前inumの を取得する、というように、ルートに到達するまで再帰的に繰り返すというものでした。

パフォーマンスはあまり高くないようですが、最初のハックには適しています。

私の問題は、 s で取得した sからfs.c:iget()a を取得する必要があることです。私はそれが static で宣言されていないことに気付きましたが、これは私を少し悩ませますが、その理由を見つけることができません。struct inodeinumdirentiget()fs.cdefs.h

これが私の質問です。iget()カーネルの残りの部分から故意に隠されているのはなぜですか?

4

2 に答える 2

1

私には、彼らはただ実用的だったようです。

iget は、ディレクトリ操作ルーチンによってのみ使用されます。ディレクトリ操作ルーチンは fs.c にあります。

getcwd の実装について。chdir syscall コードに従うと、はるかに良いでしょう。パスはそこにあります。おそらくproc構造の新しいフィールドに保存する必要があります。もちろん、指定されたパスが相対パスである場合は、現在保存されているパスに追加する必要があります。

于 2014-05-13T15:59:45.493 に答える
0

私の意見では、あなたの質問に対する答えは次のとおりです。

  1. それは安全ではなく、一般的ではありませんでした。(ディレクトリをトラバースせずにinode経由で直接ファイルにアクセスできる場合、セキュリティはどのように維持されますか?ファイルに対する許可と親ディレクトリに対する実行が必要です)
  2. inode でファイルにアクセスすることは決定的ではありませんでした (同じ inode を持つファイルが複数のディレクトリにある可能性があり、inode 番号は特定の FS だけで一意です)。

しかし、おそらく私はあなたを誤解しましたか?cwd を取得する方法については、解決策へのポインターを好むと確信しているので、これが役立つかもしれません。

  1. u.u_dent.u_name には何が保持されていますか? (user.h をよく見てください)

これらも参照してください。

http://lwn.net/Articles/254486/

inode でファイルを操作できないのはなぜですか?

cでinode値でディレクトリ名を取得する方法は?

于 2014-04-30T22:39:45.170 に答える