Как получить файл структуры открытого файла?

#c #linux-kernel

#c #linux-ядро

Вопрос:

Я хочу найти путь к файлу в модуле ядра. Единственная информация, которая у меня есть, — это дескриптор файла.

Я прочитал несколько сообщений и увидел, что с помощью dentry_path_raw(filp->f_path.dentry,buf,buflen) можно получить путь, где filp — указатель на файл структуры.

После некоторого поиска я знаю, что «файловая структура представляет собой открытый файл. (Это не относится к драйверам устройств; каждый открытый файл в системе имеет связанный файл структуры в пространстве ядра.) Он создается ядром при открытии и передается любой функции, которая работает с файлом «.

Но как получить этот файл структуры в первую очередь?

Комментарии:

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

2. Вы можете получить struct file * из дескриптора файла для текущего контекста задачи только с fget() помощью . Вызовите fput() после этого.

3. @user7176709 Не могли бы вы уточнить, пожалуйста? Например, какой драйвер для файла? Я впервые что-то делаю с модулем ядра.

4. @Ian Abbott: Возможно, это глупый вопрос, но я не нашел функции fget() . Вы имеете в виду fgets()? Разрешено ли его использовать в пространстве ядра? и он не принимает дескриптор файла в качестве одного из своих аргументов.

5. Я имел в виду функцию ядра fget , объявленную #include <linux/file.h> .

Ответ №1:

struct file обычно передается функциям open and release модуля ядра.

В вашем модуле ядра вы обычно заполняете file_operations объект:

 static struct file_operations my_fops = {
    .owner = THIS_MODULE,
    .open = my_open,
    .release = my_release,
};
  

Затем реализуйте функции:

 static int my_open(struct inode *inode, struct file *filp) {
        // Here you get the `filp`
        return 0;
}
static int my_release(struct inode *inode, struct file *filp) {
        // Here you get the `filp`
        return 0;
}
  

После установки вашего модуля система автоматически вызовет my_open , когда приложение вызывает open() функцию для этого модуля, передавая filp указатель.