Реализация основной файловой системы

Как проект колледжа я должен реализовать основную файловую систему из файла. Таким образом, как я иду об этом? Каковы вещи, которые я должен был бы знать? Требования включают наличие процесса демона в фоновом режиме. Также приложения, которые используют эту систему, должны соединиться с сервером с помощью сокета домена Unix

Файловая система должна иметь следующие возможности:

  1. Файлы списка хранятся наряду с их размерами.
  2. Создайте файлы
  3. Позвольте изменения в файлах
  4. Удалите файлы
9
задан Ciro Santilli 新疆改造中心法轮功六四事件 8 May 2015 в 07:56
поделиться

4 ответа

Проверьте это, если это может помочь. http://www.geocities.ws/ravikiran_uvs/articles/rkfs.html

Если вы хотите создать файловую систему в пользовательском пространстве, FUSE может вам помочь. http://fuse.sourceforge.net/

2
ответ дан 4 December 2019 в 23:39
поделиться

Можно ознакомиться с общей инфраструктурой ведения журнала . Это фасад вокруг рамок лесозаготовок, таких как log4net и LAB.

-121--4244673-

Общий словарь реализован в виде хэш-таблицы, поэтому сложность алгоритма - O (1). Так что если перечисление довольно большое, это наиболее быстрый путь.

ОТРЕДАКТИРОВАНО: Чтобы прояснить... Предположим, что у вас есть несколько делегатов, которые объявляют правило преобразования, где ОДИН из них по умолчанию (SA- > DA), давайте назовем: default_delegate.

class MyMapper
{
    delegate DestEnum singlemap(SourceEnum);
    static Dictionary<SourceEnum, singlemap> _source2dest = 
       new Dictionary<SourceEnum, singlemap>();
    static MyMapper()
    {
         //place there non-default conversion
         _source2dest[S_xxxx] = My_delegate_to_cast_S_xxxx;
         ......
    }
    static singlemap MapDelegate(SourceEnum se)
    {
        singlemap retval;
        //checking has complexity O(1)
        if(_source2dest.TryGetValue ( se, out retval) )
            return retval;
        return default_delegate;
    }

Поэтому при вызове MyMapper.MapDelegate возвращает любое время удаления для делать сопоставления.

-121--4407494-

Файловая система по существу является базой данных для файлов. Главное, что вам нужно, это таблица поиска для хранения смещений байтов и длин файлов. Имена файлов также могут храниться в таблице или в первых нескольких байтах при каждом смещении. Вам будет намного проще сделать файловую систему фиксированным размером.

Это будет аналогично работе файловой системы FAT.

Вы также можете взглянуть на http://en.wikipedia.org/wiki/Database_storage_structures , поскольку на самых низких уровнях файловые системы и базы данных очень похожи.

1
ответ дан 4 December 2019 в 23:39
поделиться

Вот пример очень, очень простой реализации FUSE, которая поддерживается прославленным сегментом разделяемой памяти (xenstore). Это форк оригинальной файловой системы xenstore FUSE, которую я поддерживаю.

Вы также найдете код, показывающий, как сделать Valgrind более полезным при отладке реализаций FUSE.

Вы пишете функции для open / create / read / write / truncate / getattr / etc и передаете их в fuse (номера строк взяты из связанного примера):

   343 static struct fuse_operations const xsfs_ops = {
   344  .getattr = xsfs_getattr,
   345  .mknod = xsfs_mknod,
   346  .mkdir = xsfs_mkdir,
   347  .unlink = xsfs_rm,
   348  .rmdir = xsfs_rmdir,
   349  .truncate = xsfs_truncate,
   350  .open = xsfs_open,
   351  .read = xsfs_read,
   352  .write = xsfs_write,
   353  .readdir = xsfs_readdir,
   354  .create = xsfs_create,
   355  .destroy = xsfs_destroy,
   356  .utime = xsfs_utime,
   357  .symlink = xsfs_symlink,
   358  .init = (void *)xsfs_init
   359 };

Как видите, это очень понятно. Небольшой поиск также приведет к обнаружению многих базовых примеров реализации FUSE с файловой поддержкой.

Я настоятельно рекомендую делать это полностью в пространстве пользователя, если у вас нет достаточно времени, чтобы достаточно хорошо познакомиться с ядром.

3
ответ дан 4 December 2019 в 23:39
поделиться

Самым простым способом сделать это было бы построить шаблон для хранения данных, и разобрать файлы в таран, конечно, это не самый эффективный способ.

Что-то вроде...

SOME/LOCATION/Filename >>> содержимое файла здесь, бла-бла-бла. <<< ЗАПИСЬ/ОТДЕЛЬ/МЕСТНОЕ РАЗМЕЩЕНИЕ/Имя файла >>>> содержимое другого файла здесь <<<

Затем, чтобы перечислить каталог, с помощью regex найдите все строки, заканчивающиеся на >>>, затем разберите до X-ой косой черты (исходя из количества косых черт в искомой папке), и выполните поиск с учетом регистра (в), исходя из того, хотите ли вы, чтобы он был чувствителен к регистру или нет. Конечно, как я уже говорил, загружая его в память, вы можете искать хэш-маску ключа>значения, что, вероятно, было бы намного проще.

0
ответ дан 4 December 2019 в 23:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: