为什么iget()隐藏在xv6中

时间:2014-04-21 19:58:03

标签: pwd getcwd xv6

我正在玩xv6,这是Unix版本6的现代实现。

对于我的第一个hack,我想实现简单的getcwd系统调用,但是我有点迷失我应该使用哪种抽象级别。

  • 我应该使用struct file界面吗?
  • 或者可能是struct inode界面?
  • 重要的是,它似乎甚至可以纯粹在用户地区实施。

我开始使用struct inode操作实现它。我天真的想法是检索proc->cwd,然后检索readi()第二个条目(..),扫描它以检索我之前的inum,依此类推,直到我点击根

看起来不太高效,但这适合第一次黑客攻击。

我的问题是,我需要fs.c:iget()从我struct inode中获得的inum中检索dirent。我注意到iget()中的fs.c是静态的,而defs.h中没有声明,这让我有点恼火,但我找不到原因。

所以,这是我的问题。为什么iget()故意隐藏在内核的其他部分?

2 个答案:

答案 0 :(得分:1)

对我来说,他们只是务实。

iget仅由目录操作例程使用。 目录操作例程在fs.c。

至于getcwd实现。 如果你遵循chdir系统调用代码会好得多。 路径就在那里。 您只需将其存储在proc结构中的新字段中即可。 当然,如果给定的路径是相对的,则应将其附加到当前存储的路径。

答案 1 :(得分:-1)

在我看来,回答你的问题是:

  1. 它不安全且不通用。 (如果您可以通过inode直接访问文件,而无需遍历dirent,那么如何保护安全性?您需要获得文件权限以及执行父目录)
  2. 通过inode访问文件是不确定的(具有相同inode的文件可能位于多个目录中,并且inode编号对于给定的FS是唯一的)
  3. 但也许我误解了你?关于如何获得cwd,我很确定你更喜欢指向解决方案的指针,所以这可能会有所帮助:

    1. u.u_dent.u_name中保留了什么? (仔细看看user.h)
    2. 您可能也想看看这些:

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

      Why can't files be manipulated by inode?

      how to get directory name by inode value in c?