Как открыть каталог на уровне ядра, используя дескриптор файла для этого каталога? - PullRequest
3 голосов
/ 02 декабря 2011

Я работаю над проектом, в котором я должен открыть каталог и прочитать файлы / каталоги внутри на уровне ядра.Я в основном пытаюсь выяснить, как ls реализован на уровне ядра.

Сейчас я выяснил, как получить дескриптор файла для каталога, используя sys_open() и O_DIRECTORY flag, но я не знаю, как прочитать полученный fd.Если у кого-то есть какие-либо советы или другие предложения, я буду признателен.(Имейте в виду, это должно быть сделано на уровне ядра).

Редактировать: Короче говоря, для школьного проекта я реализую атрибуты файла / каталога.Где я храню атрибуты - это скрытая папка на том же уровне файла с заданным атрибутом.(Таким образом, файл в Desktop / MyFolder имеет папку атрибутов с именем Desktop / MyFolder / .filename_attr).Поверьте мне, мне все равно, что возиться с ядром ради забавы.Но причина, по которой мне нужно читать каталог на уровне ядра, заключается в том, что он отличается от спецификаций проекта.

Ответы [ 2 ]

5 голосов
/ 02 декабря 2011

Чтобы добавить к ответу caf, упоминающему vfs_readdir(), чтение и запись в файлы из ядра считаются небезопасными (за исключением /proc, который действует как интерфейс для внутренних структур данных в ядро.)

Причины хорошо описаны в этой статье linuxjournal , хотя они также обеспечивают возможность доступа к файлам. Я не думаю, что их метод может быть легко изменен для работы с каталогами. Более правильным подходом является обращение к файловой системе ядра inode записей, что и делает vfs_readdir.

Inode - это объекты файловой системы, такие как обычные файлы, каталоги, FIFO и другие. звери. Они живут либо на диске (для файловых систем блочных устройств) или в памяти (для псевдофайловых систем).

Обратите внимание, что vfs_readdir() ожидает параметр file *. Чтобы получить структурный указатель file из дескриптора файла пользовательского пространства, вы должны использовать таблицу дескрипторов файлов ядра.

В документации по файлам kernel.org сказано следующее:

Для поиска файловой структуры по заданному файлу читатель должны использовать API fcheck() или fcheck_files(). Эти позаботьтесь о барьерных требованиях из-за поиска без блокировки. Пример:

    rcu_read_lock();
    file = fcheck_files(files, fd);
    if (file) {
        // Handling of the file structures is special. 
        // Since the look-up of the fd (fget() / fget_light()) 
        // are lock-free, it is possible that look-up may race with 
        // the last put() operation on the file structure. 
        // This is avoided using atomic_long_inc_not_zero() on ->f_count
        if (atomic_long_inc_not_zero(&file->f_count))
            *fput_needed = 1;
        else
        /* Didn't get the reference, someone's freed */
            file = NULL;
    }
    rcu_read_unlock();
    ....
    return file;

atomic_long_inc_not_zero() определяет, равен ли refcounts нулю или обнуляется во время приращения. Если это произойдет, мы потерпим неудачу fget() / fget_light().

Наконец, взгляните на filldir_t, второй тип параметра.

4 голосов
/ 02 декабря 2011

Вы, вероятно, хотите vfs_readdir() из fs/readdir.c.

В целом, хотя код ядра не читает каталоги, код пользователя делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...