【问题标题】:Why is iget() hidden in xv6为什么 iget() 隐藏在 xv6 中
【发布时间】:2014-04-21 19:58:02
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 我认为你真的应该尝试unix.stackexchange.com 这个问题。
  • 感谢您的提示。我刚刚在那里创建了一个帖子,但我想它的访问量远低于主要的 stackoverflow。
  • 没错,但我怀疑这里的大多数用户都在使用 Unix。链接到您的其他帖子:unix.stackexchange.com/questions/126261/…
  • 好吧,unix.stackoverflow 上的帖子被标记为离题:/
  • 很抱歉,我在这里帮不上什么忙。我猜你已经找到了,但你可以试试:linuxforums.org/forum 和类似的论坛。我真的不知道 Linux 专家在哪里漫游。关于 xv6 的优秀维基百科文章虽然有大量链接:en.wikipedia.org/wiki/Xv6

标签: pwd getcwd xv6


【解决方案1】:

在我看来他们只是务实。

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

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

【讨论】:

  • 好的,我会接受的。感谢您对getcwd 的指点 :)
【解决方案2】:

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

  1. 它不安全且不通用。 (如果您可以通过inode直接访问文件,而无需遍历dirent,如何维护安全性?您需要文件的权限以及父目录的执行权限)
  2. 通过 inode 访问文件是不确定的(具有相同 inode 的文件可能位于多个目录中,并且 inode 编号仅对于给定的 FS 是唯一的)

但也许我误解了你?关于如何获得 cwd,我很确定您更喜欢指向解决方案的指针,所以也许这会有所帮助:

  1. u.u_dent.u_name 中保存了什么? (仔细查看 user.h)

您可能也想看看这些:

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

Why can't files be manipulated by inode?

how to get directory name by inode value in c?

【讨论】:

    猜你喜欢
    • 2014-08-28
    • 2023-03-23
    • 2022-08-19
    • 2021-08-26
    • 2016-04-29
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多