5

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

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

  • 我应该使用struct file界面吗?
  • 或者也许是struct inode界面?
  • 重要的是,它似乎甚至可以纯粹在用户空间中实现。

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

看起来性能不是很好,但这适合第一次破解。

不过我的问题是我需要从sfs.c:iget()中检索到 s 中的 a 。我注意到这是静态的,没有声明,这让我有点恼火,但我找不到原因。struct inodeinumdirentiget()fs.cdefs.h

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

4

2 回答 2

1

在我看来,他们只是务实。

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

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

于 2014-05-13T15:59:45.493 回答
0

我认为您的问题的答案是:

  1. 这是不安全且非通用的。(如果您可以通过inode 直接访问文件,而无需遍历dirent,如何维护安全性?您需要文件的权限以及父目录的执行权限)
  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 回答