Распечатать все файлы в файловой системе, используя системный вызов - PullRequest
1 голос
/ 23 декабря 2011

Я работаю в ядре, и я пытаюсь сделать системный вызов, который принимает раздел в качестве ввода (т.е. /dev/sda1), а затем печатает каждый файл в файловой системе, используя printk(). Я вхожу в раздел (т.е. /dev/sda1) и помещаю printk() в этот системный вызов для печати. ​​

Сначала я попытался сделать это с процессом, потому что, если я прав, каждый процесс представлен task_struct, и я попытался получить доступ к файлам с files_struct. Но проблема в том, что у меня есть только файловые дескрипторы открытых файлов, а не все файлы.

Итак, я хочу передать имя раздела и printk() имена всех файлов.


Например:

Я ввожу путь /dev/sda1 в качестве аргумента и предположим, что внутри этого раздела у меня есть файлы a.txt и b.txt, поэтому системный вызов должен вывести a.txt и b.txt.

Подпись будет такой:

asmlinkage long sys_acall(char *partition_name);

1 Ответ

0 голосов
/ 30 декабря 2011

Есть несколько вещей, которые необходимо обсудить.

  • Параметр partition_name вашего системного вызова должен иметь тег __user.

  • Если вы хотите, строго говоря, читать файлы из раздела, вам необходимо реализовать распознавание файловой системы (это раздел ext3, reiserfs, ntfs, ...?), А затем реализовать драйвер для файловой системы такого типа.Как указал Христос, разделы не содержат файлов, но файловые системы содержат.Другой вариант - использовать драйверы, уже реализованные для файловой системы в этом разделе.Эта опция просто ужасна.

  • Если вы хотите читать файлы из файловой системы, ваша работа становится проще, вы можете использовать интерфейс VFS для доступа к ней, но вам потребуется эта файловая система, чтобысмонтирован (вы можете сделать это на лету, хотя).

Мое окончательное мнение, я бы изменил "реализовать системный вызов, который печатает каждый файл в разделе" для "реализоватьсистемный вызов, который печатает каждый файл в каталоге ".Подпись для этого системного вызова будет выглядеть так:

asmlinkage long sys_crazyness (__ user const char * dir);

Нам не важно, является ли переданный каталог корнем файловой системы или простопапка на любом уровне глубины файловой системы.

Если вы можете изменить свою проблему на эту, это будет намного проще;)

...