Почему 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. Конечно, если указанный путь является относительным, вы должны добавить его к текущему сохраненному пути.
На мой взгляд ответ на Ваш вопрос:
- это было небезопасно и не универсально. (Если бы вы могли напрямую обращаться к файлу через inode, не обращаясь к директам, как бы обеспечивалась безопасность? Вам нужно разрешение для файла, а также выполнение для родительского каталога)
- доступ к файлу по индексу был неокончательным (файл с одним и тем же индексом может находиться в нескольких каталогах, а номер индекса уникален только для данной FS)
а может я тебя неправильно понял? Относительно того, как получить cwd, я почти уверен, что вы бы предпочли указатель на решение, поэтому, возможно, это поможет:
- что хранится в u.u_dent.u_name? (присмотритесь к user.h)
Возможно, вы захотите взглянуть на это тоже:
http://lwn.net/Articles/254486/