Почему iget() скрыт в xv6

Я немного играю с xv6, современной реализацией Unix версии 6.

Для моего первого взлома я хотел реализовать простой getcwd системный вызов, но я немного растерялся относительно того, какой уровень абстракции мне следует использовать.

  • Должен ли я использовать struct file интерфейс?
  • Или, может быть, struct inode интерфейс?
  • Что касается вопросов, кажется, что это может быть реализовано исключительно в пользовательском пространстве.

Я начал реализовывать это с struct inode Манипуляции. Моя наивная идея состояла в том, чтобы получить proc->cwd, затем readi() его вторая запись (..), отсканируйте его, чтобы получить мой предыдущий inum и так далее до тех пор, пока я не попал в корень.

Не кажется очень эффективным, но это подойдет для первого взлома.

Хотя моя проблема в том, что мне нужно fs.c:iget() чтобы получить struct inode от inum Я попал в dirent s. Я заметил что iget() статичен в fs.c и не заявлено в defs.h это немного раздражает меня, но я не могу найти причину почему.

Итак, это мой вопрос. Почему это так iget() был намеренно спрятан от остальной части ядра?

2 ответа

Решение

Мне кажется, они были просто прагматичными.

iget используется только процедурами управления каталогами. Процедуры манипулирования каталогами находятся в fs.c.

Что касается реализации getcwd. Было бы намного лучше, если бы вы следовали коду системного вызова chdir. Путь есть. Вам просто нужно сохранить его, вероятно, в новом поле в структуре proc. Конечно, если указанный путь является относительным, вы должны добавить его к текущему сохраненному пути.

На мой взгляд ответ на Ваш вопрос:

  1. это было небезопасно и не универсально. (Если бы вы могли напрямую обращаться к файлу через inode, не обращаясь к директам, как бы обеспечивалась безопасность? Вам нужно разрешение для файла, а также выполнение для родительского каталога)
  2. доступ к файлу по индексу был неокончательным (файл с одним и тем же индексом может находиться в нескольких каталогах, а номер индекса уникален только для данной FS)

а может я тебя неправильно понял? Относительно того, как получить cwd, я почти уверен, что вы бы предпочли указатель на решение, поэтому, возможно, это поможет:

  1. что хранится в u.u_dent.u_name? (присмотритесь к user.h)

Возможно, вы захотите взглянуть на это тоже:

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

Почему файлы не могут быть обработаны inode?

как получить имя каталога по значению inode в c?

Другие вопросы по тегам